zoukankan      html  css  js  c++  java
  • AcWing 785.快速排序

    AcWing 785.快速排序题解

    题目描述

    给定你一个长度为n的整数数列。

    请你使用快速排序对这个数列按照从小到大进行排序。

    并将排好序的数列按顺序输出。

    输入格式

    输入共两行,第一行包含整数 n。

    第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。

    输出格式

    输出共一行,包含 n 个整数,表示排好序的数列。

    数据范围

    1n100000

    输入样例:

    5
    3 1 2 4 5
    

    输出样例:

    1 2 3 4 5

    快速排序的思路

    利用的就是分治的思想,假定数组为q, l 和 r 分别代表了左右边界

    1. 选取标准值-可为x = q[l],q[r],q[l + r >> 1],随机值
    2. 将区间分为两段,分别满足不同的性质(例如升序,使得边界点左边的数小于等于x,右边的数大于等于x)
    3. 递归处理

    代码如下:

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int inf = 100010;               
     6 
     7 void quickSort(int q[], int l, int r){
     8     if(l >= r) return;
     9     int i = l - 1, j = r + 1, x = q[l + r >> 1];
    10     while(i < j){
    11         do ++i; while(x > q[i]);
    12         do --j; while(x < q[j]);
    13         if(i < j) swap(q[i], q[j]);
    14     }
    15     quickSort(q, l, j); quickSort(q, j + 1, r);
    16 }
    17 int main(){
    18     int n;
    19     int arr[inf];
    20     cin >> n;
    21     for(int i = 0; i < n; ++i)
    22         cin >> arr[i];
    23     quickSort(arr, 0, n - 1);
    24     for(int i = 0; i < n; ++i)
    25         cout << arr[i] << " ";
    26     return 0;
    27 }

    需要注意的是,选取标准值的时候如果选取的是两端的边界值要注意划分的区间问题,否则会无限递归

  • 相关阅读:
    Chapter 17_1 弱引用table
    Chapter 16_5 单一方法
    Chapter 16_4 私密性
    Chapter 16_3 多重继承
    Chapter 16_2 继承
    Chapter 16_1 Class
    Chapter 16_0 面向对象编程
    小米2s刷机
    Chapter 15_4 子模块和包
    ASP.NET Core MVC 泛型接口的声明调用与注入服务
  • 原文地址:https://www.cnblogs.com/Lngstart/p/12257406.html
Copyright © 2011-2022 走看看