快速排序步骤:
- 首先,对于一个无序数组,开始时选取一个数(通常是首位)作为我们判断的依据。
- 从尾端往前遍历,找出一个数小于我们的目标数,两者交换。
- 从头端往后遍历,找出一个数大于我们的目标数,两者交换。
- 重复上述步骤,直到目标数在最中间,左边的都是小于它的数,右边的都是大于它的数。(即i==j时结束)
- 递归。在小于它的数中间继续重复排序。直至三个数排序排好。
- 递归。在大于它的数中间继续重复排序。直至三个数排序排好。
代码实现:
#include<iostream>
using namespace std;
void Quicksort(int a[],int left,int right)
{
if(left < right)
{
int x = a[left];
int i = left;
int j = right;
while(i < j)
{
while(i < j && a[j] > x)
j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < x)
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = x;
Quicksort(a,left,i-1);
Quicksort(a,i+1,right);
}
}
int main()
{
int a[9] = {4,1,2,5,3,6,7,9,8};
int len = sizeof(a)/sizeof(int);
Quicksort(a,0,len-1);
for(int i=0;i<len;i++)
cout << a[i] << " ";
return 0;
}
时间复杂度
理论上分析一下:
最坏情况:假设每一次最左边需要比较的元素在j--的过程中,一直都没有遇到比它小的元素,那么总共比较n-1次,第二轮则要n-2次,以此类推。。。(n-1)+(n-2)+...+1=1/2n^2。 时间复杂度为O(n^2)。
最好情况:每次五五分,那么就类似二分查找一般的“二分排序”,总共递归次数只需要二叉树的深度logn,每次递归比较n次。时间复杂度为O(nlogn)。
平均情况:O(nlogn)。证明过程略,太复杂记住即可。