此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接: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 }
时间: 2024-11-17 23:34:01