(1)基本思想:
1. 原理:
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
2. 时间复杂度方面:
最好情况是
1.数组的大小是2的幂,这样分下去始终可以被2整除。假设为2的k次方,即k=log2(n)。
2.每次我们选择的值刚好是中间值,这样,数组才可以被等分。
第一层递归,循环n次,第二层循环2*(n/2)......
所以共有n+2(n/2)+4(n/4)+...+n*(n/n) = n+n+n+...+n=k*n=log2(n)*n
所以算法复杂度为O(log2(n)*n)
最差情况是每次选择到的middle都是最小值或最大值,那么将变成交换法(由于使用了递归,情况更糟),时间复杂度退化成o(n*n)
快速排序并不是稳定的排序,适用于N比较大的情况,而不适合于基本有序的情形下。
(2)实例:
上图中将待排序列分成两部分,一部分比基准元素小,一部分大于基准元素,然后对这两部分重复上图的求解过程。(这只是快速排序的一种实现方式,个人认为比较容易理解)
(3)源代码:
void quickSort(int a[],int left,int right)
{
int low=left,high=right;
int base=a[low];
while (low
{
while(a[high]>base&&low
high--;
if (low
{
a[low]=a[high];
low++;
}
while(a[low]
low++;
if (low
{
a[high]=a[low];
high--;
}
}
a[high]=base;
if (left
quickSort(a,left,low-1);
if (right>high+1)
quickSort(a,high+1,right);
}
int main()
{
int i=0,a[10]={1,3,2,4,5,2,8,9,6,10};
cout<
while (i!=10)
{
cout<
}
cout<
cout<
i=0;
quickSort(a,0,9);
while (i!=10)
{
cout<