【算法设计-快速排序】随机快速排序算法

本文介绍了快速排序算法的三种划分情况,包括最坏情况、最好情况和平衡划分,并分析了它们的时间复杂度。为了解决部分有序数据导致的效率下降问题,文章提出了使用随机选择方法改进快速排序,通过random_partition函数确保更均匀的划分,从而提高算法性能。最后,提供了C语言的代码实现来展示快速排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值