快速排序

首先以几个图片大致说一下这个算法的思路是什么:
kuaipaikuaipai2kuaipai3

然后看以下代码事例:
其中arr[]是装关键字的数组,low和high是处理关键字的范围,初始就为整个数组。if(low<high)成立才递归,很明显是因为low>high了,说明子序列就不存在了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void quickSort(int arr[],int low,int high)
{
int temp;
int i=low;j=high;
if(low<high)
{
temp=arr[low];
while(i<j)
{
while(j>i&&arr[j]>=temp) --j;
if(i<j)
{
arr[i]=arr[j];
++i;
}
while(i<j&&arr[i]<temp) ++i;
if(i<j)
{
arr[j]=arr[i];
--j;
}
}
arr[i]=temp;
quickSort(arr,low,i-1);
quickSort(arr,i+1,high);
}
}

这里我说明一下这段代码的大致意思。首先先讲i,j指向low,high。temp先指定low处的关键字,然后第10行的while循环,这个循环的主要目的是找到一个arr[j]处的关键字比temp指的小,不然就一直往前移(–j),如果找到了,且满足if(i<j),就将这个小的值,移到temp处,即往前移,然后让i往后移。同样的道理,在i处是找到比temp大的数就停下来,让这个大的数往后移,即与arr[j]交换,j往前再走一步。如此一直循环,直到不满足i<j。然后退出第8行的循环,将此时的temp赋给arr[i]。
kuaipai5

接着到了24行,进入递归,level1(0,3,7)是为了方便理解自己写出来的,指出范围为0到7,且i,j指向3。在第一次进入这个递归的时候,low=0,i-1=2;所以,如图所示。
kuaipai6

i=0,j=2.temp暂存arr[0]=27。然后下面的while循环同上面的过程一样。一直走到第23行,循环完之后,i和j同时指向了1。所以我们可以记录为level2(0,1,2),代表这次是在0到2中循环且最后落在在了1这个位置。然后我们又来到了第24行,又进入了递归,此时i=j=0,进入递归,在第5行if(low<high)处就不满足条件了,就直接跳出来了一直到代码底此时的记录应该为level3(0, ,0)1。
然后,我们跳出来了,我们就得从递归函数那出来,此时我们的level还是上一个,即level2(0,1,2),然后程序执行来到第25行,又得进入一个递归,此时i=2,high=2.不满足第5行的if。就跳出来,然后从这个递归入口函数又出来,此时为level3(0, ,0)2。然后回到上一个递归,即到了level3(0,,0)1。上面已经知道了,这一层也不满足条件直接跳过,所以我们来到了level1(0,3,7)。然后执行第25行,i=4,j=7。然后进入if判定进行循环,接着个判定大小移动的操作和上面的步骤一样。此时level(4,6,7)2。然后在 准备进入递归入口函数,然后循环,然后再出递归,。。。以此再操作。