快速排序
基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
快速排序的示例:
(a)一趟排序的过程:
(b)排序的全过程:
2、算法复杂度
最好的情况下:因为每次都将序列分为两个部分(一般二分都复杂度都和logN相关),故为 O(N*logN)
最坏的情况下:基本有序时,退化为冒泡排序,几乎要比较N*N次,故为O(N*N)
3、稳定性
由于每次都需要和中轴元素交换,因此原来的顺序就可能被打乱。如序列为 5 3 3 4 3 8 9 10 11会将3的顺序打乱。所以说,快速排序是不稳定的!
void QuickSort(int* a , int low, int high)
{
if(low<high)
{
int temp = a[low]; //找到基准元素 (挖一个坑)
int i=low;
int j=high;
while(i < j)
{
while(i<j && a[j]>=temp) //<----- 冒似找大实际找小
j--;
if(i<j) a[i++]=a[j]; //i++ 不是 ++i
while(i<j && a[i]<temp) //-----> 冒似找小实际找大
i++;
if(i<j) a[j--]=a[i];
}
a[i]=temp;
QuickSort(a , low, i-1);
QuickSort(a , i+1, high);
}
}