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.短子列表

  • 相关阅读:
    内存堆与栈的区别
    深度理解相对路径和绝对路径
    INFO:InstallAnywhere的Enterprise版本和Standard版本的主要区别
    HOWTO:InstallShield中如何调用批处理文件
    HOWTO:InstallScript工程中如何在用户协议界面中默认为接受协议
    HOWTO:InstallShield中如何通过脚本获取“My Documents”路径
    INFO:InstallShield工程中关于.NET依赖项的编译扫描警告
    InstallShield Kevin Wan博客文章索引列表(001~100)
    HOWTO:在InstallShield脚本中打开一个URL链接
    INFO:在InstallShield中修改安装包压缩.cab包的大小
  • 原文地址:https://www.cnblogs.com/fripside/p/2893195.html
Copyright © 2011-2022 走看看