T325337 【模板】快速排序

题目描述

利用快速排序算法将读入的 N 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 11 行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数,数据保证了 ai 不超过 109109。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 #1
5
4 2 4 5 1
输出 #1
1 2 4 4 5

说明/提示

对于 20%20% 的数据,有 N103;

对于 100%100% 的数据,有 N105。

题解

快排是通过多次比较和交换来实现的排序。首先设定一个分界值,通过该分界值将数组分成左右两部分。将大于或等于分界值的数据集中到数组的右边,将小于分界值的数据集中到数组的左边。这样就能使得左边部分都小于或等于分界值,右边部分都大于等于分界值。

接着,对左右两边的数据,可以再分别选择一个新的分界值,并重复之前的操作。

经过不断的重复后,排序完成。

#include <iostream>

using namespace std;

void Q(int a[],int low,int high)
{
    int i,j;
    int temp;
    if(low>=high) return;
    i=low;
    j=high;
    temp=a[i];
    while(i<j)
    {
        while(i<j&&temp<a[j]) j--;
        if(i<j)
        {
            a[i++]=a[j];
        }
        while(i<j&&a[i]<=temp) i++;
        if(i<j)
        {
            a[j--]=a[i];
        }
    }
    a[i]=temp;
    Q(a,low,--j);
    Q(a,++i,high);
}
int main()
{
    int n,i;
    cin>>n;
    int a[n];
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    Q(a,0,n-1);
    for(i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }

    return 0;
}

 

 

posted @ 2023-04-22 13:41  Dachi7  阅读(15)  评论(0)    收藏  举报