P1177 【模板】快速排序
题解:
快速排序的模板题,但需要注意的是参考值的选择,鄙人第一次是直接指定a[left]为参考值,结果TLE。
应该是数据比较刁钻,看了下别人的博客,发现将参考值设为中间值更快一点,即a[(left+right)/2]。
代码2,为什么while里面的if条件是 i <= j 呢,因为只有这样才能在i和j都到中间值时都再向前增一位,使得中间值不再参与排序。
代码1:
/*
此代码过不了本题!!!
*/
#include<bits/stdc++.h>
using namespace std;
int a[100005];
void quicksort(int left,int right){
if(left > right) return;
int i,j,k,t;
i = left;j = right;k = a[left];
while(i != j){
while(a[j] >= k && i < j)
--j;
while(a[i] <= k && i < j)
++i;
if(i < j){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = k;
quicksort(left,i-1);
quicksort(i+1,right);
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; ++i)
cin >> a[i];
quicksort(0,n-1);
for(int i = 0; i < n; ++i){
if(i != 0) cout << ' ';
cout << a[i] ;
}
cout << endl;
return 0;
}
代码2:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
void quick_sort(int left,int right){
int i,j,t,mid;
i = left;
j = right;
mid = a[(i+j)/2];
while(i < j){
while(a[j] > mid) --j;
while(a[i] < mid) ++i;
if(i <= j){
t = a[i];
a[i] = a[j];
a[j] = t;
--j;
++i;
}
}
if(left < j) quick_sort(left,j);
if(i < right) quick_sort(i,right);
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; ++i)
cin >> a[i];
quick_sort(0,n-1);
for(int i = 0; i < n; ++i){
if(i != 0) cout << ' ';
cout << a[i] ;
}
cout << endl;
return 0;
}