洛谷 P1177 模板快速排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1177 模板快速排序相关的知识,希望对你有一定的参考价值。

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=1177

题目描述

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

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

输入输出格式

输入格式:

输入文件sort.in的第1行为一个正整数N,第2行包含N个空格隔开的正整数a[i],为你需要进行排序的数,数据保证了A[i]不超过1000000000。

输出格式:

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

输入输出样例

输入样例#1:
5
4 2 4 5 1
输出样例#1:
1 2 4 4 5

说明

对于20%的数据,有N≤1000;

对于100%的数据,有N≤100000。

 

注意:下面给出的代码并没有AC,而是TLE了3个点。但博主后来用此代码提交了另外一个数据范围扩大了10倍的排序题,成功AC,所以博主也不知道这题是什么情况,如果有人找出代码的问题欢迎留言反馈,非常感谢。

 

未AC代码:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio> 
 6 
 7 const int MAXN = 1000005;
 8 int n;
 9 int num[MAXN];
10 
11 inline void read(int &x)
12 {
13     char ch = getchar(),c = ch;x = 0;
14     while(ch < 0 || ch > 9) c = ch,ch = getchar();
15     while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
16     if(c == -) x = -x;
17 }
18 
19 inline void swap(int &a,int &b)
20 {
21     int tmp = a;
22     a = b;
23     b = tmp;
24 }
25 
26 void q_sort(int l,int r)
27 {
28     int i = l,j = r;
29     
30     if(i >= r)
31         return;
32     
33     int tmp = num[l];
34     while(i < j)
35     {
36         while(num[j] >= tmp && i < j)
37             j --;
38         while(num[i] <= tmp && i < j)
39             i ++;
40         if(i < j) swap(num[i],num[j]);
41     }
42     if(num[l] > num[i]) swap(num[l],num[i]);
43     q_sort(l,i);
44     q_sort(i+1,r);
45 }
46 
47 int main()
48 {
49     read(n);
50     for(int i = 1;i <= n;++ i)
51         read(num[i]);
52     q_sort(1,n);
53     for(int i = 1;i <= n;i ++)
54     {
55         printf("%d ",num[i]);
56     }
57     puts("");
58     return 0;
59 }

 

以上是关于洛谷 P1177 模板快速排序的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1177 模板快速排序 快速排序/multiset排序

洛谷P1177快速排序

P1177 模板快速排序

P1177 模板快速排序

题解 P1177 模板快速排序

P1177 模板快速排序