算法精解----快速排序2

来源:互联网 发布:淘宝内裤 男 买家秀 编辑:程序博客网 时间:2024/06/01 12:23

前面排序方法有个很明显的bug就是递归次数很多,而且递归进去的时候什么也不干。这样非常浪费CPU资源,所以呢,现在说说另外一种快速排序的方法,这种方法和前面的不同,前面的方法是K值分别和大于它的值和小于它的值进行交换,这样也就是说,如果发生交换操作,那么只能够是一个大于的值或者一个小于的值。但是现在的方法就是如果发生交换,那么将会是大于值和小于值同时进行交换,就是两两交换。代码如下:

void fastSort2(int *p, int start, int end){if ((start == end) || (end -1 < 0))return;int i = start;int j = end -1 ;int k = p[end];//Kint temp = 0;while (i < j){while (i < j && p[i] <= k){i++;}while (i<j && p[j] >= k){j--;}//条件满足temp = p[i];p[i] = p[j];p[j] = temp;}//交换中间的值if (k < p[j]){temp = p[j];p[j] = k;p[end] = temp;}fastSort2(p, start, ((j - 1) > start) ? (j - 1) : start);fastSort2(p, ((j + 1) < end) ? (j + 1) : end  , end );}


如下:下面就是中间的大小值交换步骤,也就是这里的交换操作是不需要K值进行干涩的,只是需要K值参与判断操作。

比如下面数列,当前K值是5,现在i和j分别是0,3

6 1 4 2 5

那么6将会和2进行交换。

while (i < j){while (i < j && p[i] <= k){i++;}while (i<j && p[j] >= k){j--;}//条件满足temp = p[i];p[i] = p[j];p[j] = temp;}

当我们把中间的值交换的差不多了,也就是达到我们循环退出条件的时候

while (i < j)

我们就推出去,需要进行交换K值判断,如下:

//交换中间的值if (k < p[j]){temp = p[j];p[j] = k;p[end] = temp;}


这里有个条件就是k值小于p[j]的时候,我们就需要进行判断,当然k大于p[j]的时候,我们就没有那个必要进行交换了。如果交换了,后期将会出现问题。

下面我们看看调试动画:



好了,大概就是上面说的那样。



0 0
原创粉丝点击