题目:

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1n100000

输入样例:

5
3 1 2 4 5

输出样例:1 2 3 4 5


正文:

快速排序即在给定的数列中随便找一个数赋值到X上(找最中间的数据对于整个程序所花费的时间应该是较少的)
(此处默认快速排序为升序排序),
同时定义左边的指针和右边的指针在数列最两侧,设i为左边的指针,j为右边的指针,同时先从左侧开始寻找,若i指代的数大于X,
即停止i++,然后再从右侧j来寻找,直到找到j指代的数小于X并停止寻找,此时恰好可以使i和j互换,达到交换的目的;

当指针交汇,再从已经以X为分界的两个区间再进行上述操作(通过递归执行,结束条件是左边界大于右边界)

以下为具体代码:

#include <bits/stdc++.h>
using namespace std;
void quick_sort(int q[],int l,int r)
{
  if(l>=r) return;                  //此处一定要将等于号加上,不然会形成死循环;

  int x=q[(l+r)/2],i=i-1,j=r+1;            //X取中间的数有利于提高速度,但不追求速度的情况下,用其中数列中任意一个数来进行快排都是可以的;
  while(i<j)

  {

    do i++;while(q[i]<x);
    do j–;while(q[j]>x);
    if(i<j) swap(q[i],q[j]);            //交换
  }
  quick_sort(q,l,j);                //继续小区间快排
  quick_sort(q,j+1,r);
  }
int main()
{
  int n;
  int a[100005];
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    scanf(“%d”,&a[i]);             //用scanf而不是cin是由于scanf比cin要快,由于快排的题目多涉及大数字,容易超时,因此用scanf更为保险,但cin也可以用;
  }
  quick_sort(a,1,n);
  for(int i=1;i<=n;i++)
  {
    printf(“%d “,a[i]);
  }
}

 

版权声明:本文为wyjnb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wyjnb/p/13892074.html