博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序
阅读量:5745 次
发布时间:2019-06-18

本文共 2550 字,大约阅读时间需要 8 分钟。

一.挖坊填补法

先选择一个标准值,将它取出,我们把它看做一个坑。

我们选择最低的一位作为标准值。

从后向前遍历,(高指针向低指针遍历)找到比这个标准值小的值就放入坑中,这时就产生了一个新的坑。

再从前向后遍历,(低指针向高指针遍历)找到比标准值大的值则放入坑中,这时产生了一个新的坑。

再从后向前遍历(高指针向低指针遍历)。。。。。

当高低指针相遇的时候,将标准值放入。这时标准值得左边都是比标准值小的,标准值得后面都是比标准值大的。

将左边,和右边看成独立数组,重复以上步骤。(递归实现)

代码:

int  FindStandard(int *arr,int low,int high){    int num = arr[low];    while(low < high)    {        //从后向前找        while(low < high)        {            if(arr[high] < num)            {                arr[low] = arr[high];                break;            }            high--;        }        //从前向后找        while(low < high)        {            if(arr[low] > num)            {                arr[high] = arr[low];                break;                }            low++;            }    }    arr[low] = num;    return low;}void QuickSort(int* arr,int low, int high){    if(arr == NULL || low >= high)        return;    int Standard = FindStandard(arr,low,high);    //以标准值为界限分为左半部分和右半部分,再分别重复以上步骤    QuickSort(arr,low,Standard-1);    QuickSort(arr,Standard+1,high);}

优化1:如何提高系统效率?while循环嵌套的效率比较低,改用for,从一个方向遍历。则有了第二种方法:区间分割法。

二. 区间分割法

思路:将最后一个数先作为标准值,然后从低位向高位遍历,比较。设置一个标记,为比标准值小的数。

如果此数比标准值小,看是否为标记的下一个,是则标记++;不是则与标记的下一个值交换。这样可以保证从最低位到标记都是比标准值小的。

最后将最后一位的值也就是标准值与标记的下一个交换。

这样标准值前面的都是比标准值小的,标准值后面的都是标准值大的。标准值位置即排好序的位置。

将标准值左右分为两个数组。左右分别调用此

代码:

int FindStandard(int* arr,int low,int high){    int small = low-1;//标记位    for(low;low < high;low++)    {        if(arr[low] < arr[high])        {            //如果该比标准值小的值不是标记的下一位,那么标记的下一位与该值交换。是则small++            //所以可以先small++,如果不是标记的下一位则交换,是则不执行。            if( ++small != low )            {                arr[small] = arr[small]^arr[low];                arr[low] = arr[small]^arr[low];                arr[small] = arr[small]^arr[low];            }        }    }    //如果标准值就是最后一位则不用交换    if(++small != high)    {        arr[small] = arr[small]^arr[high];        arr[high] = arr[small]^arr[high];        arr[small] = arr[small]^arr[high];    }    return small;}void QuickSort(int*arr,int low,int high){    if(arr == NULL || low >= high )        return;    int standard = FindStandard(arr,low,high);        QuickSort(arr,low,standard-1);    QuickSort(arr,standard+1,high);}

优化2:如何避免标准值是最大值或最小值?     因为我们的思路是,找到一个标准值将它分为左右两个部分,如果标准是最大值,那么没有达到目的,并且邹静FindStandard的循环没有做事。  所以为了避免这种偶然事件发生我们可以选3个数,最低位,最高位和中间位。在他们3个中选择一个中间位,这样绝不可能是最大值或者最小值了。为什么不用随机数? 随机数的种子根据时间生成随机数,生成的3个数相同的概率比较大。

优化3:如何避免系统异常?  因为代码中用到了递归,系统自动调用,压入栈中,这是我们不能控制的,可能发生异常。

优化4:数据过少怎么办?   如果数据过少,我们就没有必要使用快排了,使用插入排序。

优化5:什么情况对快排来讲最坏?原因? 倒序的排号序的数组。因为

转载于:https://www.cnblogs.com/Lune-Qiu/p/9104933.html

你可能感兴趣的文章