快速排序(递归)

利用快速排序算法将读入的 N个数从小到大排序后输出,请勿使用std::sort。
输入格式
第一行一个整数 n
第二行 n 个整数
输出格式
输出一行,为 ai​ 排序后的结果。
Sample

1Input
5
4 7 1 4 6

Output

1 4 4 6 7
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5o2J5Y-q5qCR6KKL54aK,size_20,color_FFFFFF,t_70,g_se,x_16我们已经遇到好多排序题了,并且掌握了好多种排序方法,像比较常见的比较排序,桶排序,冒泡排序,但是这几种方法的时间复杂度O(M+N)或者O(N*N),这是一个非常高的时间复杂度,如果用这几种方法会时间超限,接下来的快速排序就能在一定程度上解决这个问题。

下面说一下具体排序过程:

首先我们先要设定一个基准数,通过基准数将数组a分成两个部分为接下来的排序做准备。
接下来将大于或等于基准数的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于基准数,而右边部分中各元素都大于或等于基准数。
然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以再取一个基准数,将该部分数据再分成左右两部分,继续模拟刚才的过程在左边放置较小值,右边放置较大值。右侧的数组数据也做同样的处理。
最后通过递归将左侧部分排好序后,再递归排好右侧部分的顺序,直到整个数组的排序完成。这种排序之所以快的原因是它每次的排序都是跳跃式的。

#include<stdio.h>
int a[100001],n;//定义一个全局变量,在函数中调用
void quicksort(int b,int c)
{
	int i,j,t,x;
	if(b>c) 
   return;
   x=a[b];//这里的x是基准数
   i=b; 
   j=c;
   while(i!=j)
   {
   	while(a[j]>=x&&i<j)//先从右往左找
     j--;
   	while(a[i]<=x&&i<j)//再从左往右找
    i++;
    if(i<j)
    {
    	t=a[i]; 
        a[i]=a[j]; 
        a[j]=t;
	}
	}//归位基准数 
	a[b]=a[i]; 
    a[i]=x;
	quicksort(b,i-1);//利用递归继续处理左边的数
	quicksort(i+1,c);//利用递归继续处理右边的数
 } 
int main(void)
{
	int i,j,t;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);//数据的赋值 
	 } 
	 quicksort(1,n);//快速排序的调用
	 for(i=1;i<=n;i++)
	 {
	 	printf("%d ",a[i]);//输出排序后的结果
	 }
	 return 0;
}

下面说一下快速排序的时间复杂度,它最好可以达到O(nlog2n),最坏达到O(n2),平均在O(nlog2n)左右,空间复杂度:O(nlog2n)
所以说他是非常不稳定的,做题的时候一定要看数据范围选出适合的排序方法,才能保证不会时间超限。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捉只树袋熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值