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

    1.如果待排数组array的大小是0或1则结束递归返回这个数组。

    2.从数组中选择一项作为基准项,把剩下的元素分成2个不相关的组。比该数据小的数据排列在左边,比该数据大的数据排列在右边。
    SmallThanPivot = {所有<pivot的元素} LargerThanPivot = {所有>pivot的元素}
    3.返回重排后的列表,重复前面的过程分别对左边和右边的序列进行快速排序。
    QuickSort(SmallThanPivot);Pivot;QuickSort(LargerThanPivot);
     
    75,70,65,84,98,78,100,93,55,61,81,68  
    //选取75为基准元素,从75的左端往右找到第一个大于75的元素是84,从最右往左第一个小于75的元素是68
    75,70,65,68,98,78,100,93,55,61,81,84  
    //交换这两个元素,继续从右往左找大于75的元素98,从左往右找小于75的元素61
    75,70,65,68,61,55,100,93,78,98,81,84  
    //交换55与78。此时左边的指针停留在100处,右边的指针停留在55处,两指针已碰头,这意味着查找结束,现在交换左边的55和75
    55,70,65,68,61,75,100,93,78,98,81,84  
    //现在75左边的元素都小于75,右边的元素都大于75,这样基准75的位置就确定了
    接着把数列划分成两个子列
    SmallThanPivot = {55,70,65,68,61}
    LagerThanPivot = {100,93,78,98,81,84}
     
    void quick_sort(int array[],int first,int last)
    {
        if (first >= last) {
            return;
        }
        int left = first + 1; //选取第一作为基准,为从左到右的下标
        int right = last;      //right为从右到左的下标
        while (true) {
            while (array[left] < array[first] && left <= right){
                left++; //找到左边的第一个比基准大的元素
            }
            while (array[right]> array[first] && right >= left){
                right--; //找到右边第一个比基准小的元素
            }
        
            if (left < right) {
                swap(array[left],array[right]);
            } else {
                break;
            }
        
        }
        swap(array[first],array[right]);
        int mid = right;
        quick_sort(array,first,mid-1);
        quick_sort(array,mid+1,last);
    }
    void testQuickSort()
    {
        int array[12] = {75,70,65,84,98,78,100,93,55,61,81,68};
        printArray(array,12);
        quick_sort(array,0,11);
        printArray(array,12); 
    //随机生成1000个数排序

        const int n = 1000;
        int array[n] = {0};
        srand(time(NULL));
        for (int i = 0; i < n; ++i) {
          array[i] = rand();
        }

        printArray(array,n);

        quick_sort(array,0,n-1);

        printArray(array,n);

    }

     改进方法:

    1.减少递归栈的容量

    利用栈实现快速排序:

    2.基准的选择

    3.短子列表

  • 相关阅读:
    [编程题] 数组中重复的数字
    [编程题] 用两个栈实现队列
    杜教筛学习笔记
    二次剩余学习小记
    Burnside引理和Polya定理简单入门
    6553. 【GDOI2020模拟4.11】人生
    6545. 【GDOI2020模拟4.8】 Exercise
    2020.4.5学军信友队趣味网络邀请赛总结
    51 Nod 1287 加农炮(单调队列思想+二分)
    51 Nod 1070 Bash游戏v4(斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/fripside/p/2893195.html
Copyright © 2011-2022 走看看