快速排序其运用了分割和递归
分割:一般取数组第一个元素为参照,大于它的数值放在右边,小于则放在左边。
递归:经历第一次分割后,再次对原来数组第一个元素值为分界线,依次对左右两边进行递归运算。
如下
7 | 9 | 2 | 5 | 4 | 8 | 3 |
---|
取a[0]为参照,从右边right寻找比7小的元素,则a[end]=3赋值为a[first]
3 | 9 | 2 | 5 | 4 | 8 | 3 |
---|
再次从最左边寻找比7大的数字,则a[first]=9赋值给a[end]
3 | 9 | 2 | 5 | 4 | 8 | 9 |
---|
再从右边出发,此时a[end]=4时小于7,则a[end]=4赋值给a[first]
3 | 4 | 2 | 5 | 4 | 8 | 9 |
---|
最后一次对左边分析,a[first]=2和a[first]=5都没有大于7,则移动到end的位置,把a[first]赋值为起始的a[0],则赋值为7.
3 | 4 | 2 | 5 | 7 | 8 | 9 |
---|
以上过程是进行了一次分割后的结果,还需对7的左端和右端实行递归运算。
快速排序函数如下:
void quicksort(int*a,int left,int right)
{
int first=left;
int end=right;
int key=a[first];
if(left>right)
return;
while(first<end)
{
while(first<end&&a[end]>key)
{
end--;
}
if(first<end)
a[first++]=a[end];
while(first<end&&a[first]<key)
{
first++;
}
if(first<end)
a[end--]=a[first];
}
a[first]=key;
quicksort(a,left,first-1);
quicksort(a,first+1,right);
}