快速排序的基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
例如:待排序列为4,7,5,3,6,1,8,2
定义两个变量low,high,初始分别指向第一个和最后一个数字
第一趟排序过程如下:
1、选择一个基准数字(可以为序列中任意数字),这里选择第一个数字key=4;
2、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,7,5,3,6,1,8,4 此时low指向2,high指向4;
3、从左向右遍历序列(low++),直到low指向的值大于key,交换2,4,5,3,6,1,8,7 此时low指向4,high指向7;
4、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,1,5,3,6,4,8,7 此时low指向1,high指向4;
5、从左向右遍历序列(low++),直到low指向的值大于key,交换2,1,4,3,6,5,8,7 此时low指向4,high指向5;
6、从右向左遍历序列(high--),直到high指向的值小于key,交换 2,1,3,4,6,5,8,7 此时low指向3,high指向4;
7、low+1=high,结束第一趟遍历,此时4所在位置即为排序后的最终位置;
然后分别对(2,1,3)和(6,5,8,7)进行快速排序。
关键代码如下:
int Partition(int a[], int low, int high)
{
int key = a[low];
while (low < high)
{
while (key<=a[high]&&low<high)
{
high--;
}
a[low] = a[high];
while (key >= a[low]&&low<high)
low++;
a[high] = a[low];
}
a[low] = key;
return low;
}
void QuickSort(int a[], int low, int high)
{
if (low < high)
{
int index = Partition(a, low, high);
QuickSort(a, low, index - 1);
QuickSort(a, index + 1, high);
}
}
分析:时间复杂度
最坏时间复杂度:对于带排序的n个元素,每次的划分结果中个数分别为1和n-1,此时时间复杂度为O(n2)
最好时间复杂度:每次划分均为平均划分,此时时间复杂度为O(nlogn)
平均时间复杂度:O(nlogn)