1.算法流程:
快速排序的时间复杂性分析:
1.最坏情况划分:当划分产生的两个子问题分别包含了n-1个元素和0个元素时,快速排序是最坏情况,假如每次递归调用,总是出现最不平衡划分,这是最不平衡划分。划分操作时间复杂度为Θ(n),则算法运行时间的递归表达式为T(n)=T(n-1)+T(0)+Θ(n).利用代入法可以求得T(n)=Θ(n^2).可以证明当数组完全有序时候,时间复杂度为Θ(n^2)
2.最好情况划分:当partition得到的两个子问题规模都不大于n/2时候,是最平衡划分。则递归式为T(n)=2T(n/2)+Θ(n).根据主定理,可得时间复杂度为Θ(nlgn)
3.平衡的划分:只要划分是常数比例,就是平衡划分。例如T(n)=T(9n/10)+T(n/10)+cn.两个子问题分别为9/10和1/9。利用递归树可以求得复杂度为o(nlgn)
但是为了减少算法因为初始数据可能已经部分按大小排序,导致算法复杂性会变成o(n2)进行了随机选择方法
在random_partition中随机产生(p,r)之间的一个数字,然后交换A[i]与A[r]这样会使得快速排序算法的复杂性得到降低。
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define DataType int
void FastSort(DataType A[], int left, int right);//快速排序
int random_partition(DataType A[],int p,int r)
{
int i=rand()%(r-p+1)+p;
{
int temp=A[i];
A[i]=A[r];
A[r]=temp;
}
int x=A[r];
int i=p-1;
for(int j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i=i+1;
{
int temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
{
int temp=A[i+1];
A[i+1]=A[r];
A[r]=temp;
}
return i+1;
}
void FastSort(DataType A[], int left, int right)
{
if(left<right)
{
int pivotloc=partition(A,left,right);
FastSort(A,left,pivotloc-1);
FastSort(A,pivotloc+1,right);
}
}
DataType main(void)
{
DataType *A = (DataType *)malloc(sizeof(DataType));
DataType key;
DataType i = 1;
A[0] = 0;
printf("请您随便输入数字,然后本程序对这些数字从小到大排序!按#结束\n");
while (scanf("%d", &key) == 1)
{
A[i] = key;
i++;
}
printf("排序后的结果是:\n");
FastSort(A, 1,i - 1);
DataType k;
for (k = 1; k <= i - 1; k++)
printf("%d ", A[k]);
return 0;
}