码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2020-11-04 19:17:58      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:基本   stream   快速   lang   分治   ace   str   使用   递归   

快速排序

快速排序的基本思想

  • 利用分治的思想

快速排序的基本思路

将数组分成两个部分,一个部分大于某个数,一个部分小于某个数,然后递归,直到所有的数字都排序完成

  1. 边界判断l >= rreturn
  2. 设定一个x值,这个x值可以是左边界l,右边界r,或者是(l + r)/2,甚至是随机的值(不能超过边界)
  3. 移动数据,将 <= x的值放在x的左边,将 >= x的值放在x的右边
  4. 递归

如何移动数据

开辟新的数组

方法一开辟两个新的数组,一个数组用来存放<= x的值,一个数组用来存放>= x的值

利用两个指针

在数组的头部和尾部各使用一个指针

  1. 先看左指针:左指针指向的值是否<= x 如果是,那么指针指向下一个数据(指针方向往右走),如果不是停止移动
  2. 再看右指针:右指针指向的值是否>= x 如果是,那么指针指向上一个数据(指针方向往左走),如果不是停止移动
  3. 判断左指针 < 右指针 正确的话就直接交换
  4. 重复这三步,当出现左指针 >= 右指针的时候退出循环

快排模板

#include <iostream>
using namespace std;

const int N = 1e6 + 10;

int n;
int q[N];

void q_sort(int q[], int l, int r){

    if(l >= r) return;
    
    int x = q[(l + r) >> 1];
    int i = l - 1;
    int j = r + 1;
    
    while(i < j){
        
        do {
             i++ ;
        } while (q[i] < x);
        
        do {
             j-- ; 
        } while (q[j] > x);
        
        if(i < j) swap(q[i], q[j]);
    }
    
     q_sort(q, l, j);
     q_sort(q, j + 1, r);    
}

int main(){
    
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++){
        scanf("%d", &q[i]);
    }
    
    q_sort(q, 0, n - 1);
    
    for(int i = 0; i < n; i++){
        printf("%d ", q[i]);
    }
    
    return 0;
}

快速排序

标签:基本   stream   快速   lang   分治   ace   str   使用   递归   

原文地址:https://www.cnblogs.com/meakle/p/13926004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!