前面排序方法有个很明显的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]; //K
int 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]的时候,我们就没有那个必要进行交换了。如果交换了,后期将会出现问题。
下面我们看看调试动画:
好了,大概就是上面说的那样。