快速排序算法最坏的时间复杂度时o(n*n),期望的运行时间为o(nlgn)。
逻辑分析:
1 先从数组中选取一个数作为基数,可随机选择;
2 将数组中大于该基数的放在该基数右边,小于该基数的放在该基数左边;
3对左右两个数组重复第二步。
代码分析
数组a[]={2,1,4,5,3,8,7,9,0,6},该数组第一次分区时,left=0,right=10,假设随机基数为a[4]=3。
首先将a[0]和a[4]互换位置,数组a[]={3,1,4,5,2,8,7,9,6,0}。
进行第一次分区:
i=0,j=0时,j=left,数组没有改变没有改变。
i=0,j=1时,a[j]=1<a[left]=3,故交换a[++i]和a[j]的位置,++i=1,故此时数组依然没有变化。
i=1,j=2时,a[j]=4>a[left]=3,此时数组仍然没有变化。
i=1,j=3时,a[j]=5>a[left]=3,此时数组仍然没有变化。
i=1,j=4时,a[j]=2<a[left]=3,故交换a[++i]和a[j]的位置,++i=2,数组a[]={3,1,2,5,4,8,7,9,6,0}。
i=2,j=5时,a[j]=8>a[left]=3,此时数组仍然没有变化。
i=2,j=6时,a[j]=7>a[left]=3,此时数组仍然没有变化。
i=2,j=7时,a[j]=9>a[left]=3,此时数组仍然没有变化。
i=2,j=8时,a[j]=6>a[left]=3,此时数组仍然没有变化。
i=2,j=9时,a[j]=0<a[left]=3,故故交换a[++i]和a[j]的位置,++i=3,数组a[]={3,1,2,0,4,8,7,9,6,5}。
i=3,跳出循环,交换a[i]和a[left]的位置,数组a[]={0,1,2,3,4,8,7,9,6,5。
#include<iostream>
#include<cstdlib>using namespace std;//交换a,b的值,注意如果漏掉&,结果不正确
void swap(int &a, int &b)
{int temp = a;a = b;b = temp;
}//分区 若a[j]<基数,则将a[j]的值和a[++i]交换
int partition(int a[], int left, int right)
{int i = left;for (int j = left; j < right; j++){if (a[j] < a[left]){swap(a[++i], a[j]);}}swap(a[i], a[left]);return i;
}//快速排序 用随机法选取任意一个数(数组内)作为基数,并将该数与a[left]互换
//递归方式,对分区数组再进行划分
void quickSort(int a[], int left, int right)
{if (left < right){int i = left + rand() % (right - left);swap(a[i], a[left]);int mid = partition(a, left, right);quickSort(a, left, mid);quickSort(a, mid + 1, right);}}int main()
{int a[] = { 2,1,4,5,3,8,7,9,0,6 };quickSort(a, 0, 10);for (int i = 0; i < 10; i++){cout << a[i] << "";}cout << endl;system("pause");return 0;}