0
点赞
收藏
分享

微信扫一扫

快速排序(秒懂)

生态人 2022-03-30 阅读 58
c++

利用快速排序算法将读入的 NN 个数从小到大排序后输出,请勿使用std::sort。
输入格式
第一行一个整数 n\ (1\le n \le 10^5)n (1≤n≤105)。
第二行 nn 个整数 a_i\ (1\le a_i \le 10^9)ai​ (1≤ai​≤109)。
输出格式
输出一行,为 a_iai​ 排序后的结果。
Sample

1Input
5
4 7 1 4 6

Output

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

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

做题的时候一定要看数据范围选出适合的排序方法,才能保证不会时间超限。

举报

相关推荐

0 条评论