快排 快速排序 qsort quicksort C语言
现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁。
1 #include<stdio.h> 2 #define MAXN 10000 3 int a[MAXN]; 4 int n; 5 void Mysort(int l, int r) { 6 int x,y,mid,t; 7 mid = a[(l+r)/2]; 8 x=l; 9 y=r; 10 do { 11 while(a[x]<mid)x++; 12 while(a[y]>mid)y--; 13 if(x<=y) { 14 t=a[x]; 15 a[x]=a[y]; 16 a[y]=t; 17 x++; 18 y--; 19 } 20 } while(x<=y); 21 if(l<y)Mysort(l,y); 22 if(x<r)Mysort(x,r); 23 } 24 int main() { 25 int i; 26 scanf("%d",&n); 27 for(i=0; i<n; i++) { 28 scanf("%d",&a[i]); 29 } 30 Mysort(0,n-1); 31 for(i=0; i<n; i++)printf("%d ",a[i]); 32 return 0; 33 }
(其中(x+y)/2可以写成(x+y)>>1提升速度
(最近要实习生面试了,复习一下基础算法。之前排序基本都用STL的sort了,快排都快忘了,没想到我还是一遍就打出来了蛤铪哈)
更新一下:
算导快排:
1 int mypartition(int a[], int lo, int hi){ 2 int pivot = a[hi]; 3 int i = lo; 4 for(int j=lo; j<hi; j++){ 5 if(a[j]<=pivot){ 6 swap(a[i],a[j]); 7 i++; 8 } 9 } 10 swap(a[i],a[hi]); 11 return i; 12 } 13 14 void mysort(int a[], int lo, int hi){ 15 if(lo>=hi)return; 16 int i = mypartition(a, lo, hi); 17 mysort(a, lo, i-1); 18 mysort(a, i+1, hi); 19 }
另一种快排,和最上面那个差不多,据说算导的swap次数太多,效率不如这种。这个是hdu1425代码
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 int a[1000011]; 6 7 int mypartition(int a[], int lo, int hi) { 8 int p = a[lo]; 9 int i=lo-1; 10 int j=hi+1; 11 while(true) { 12 do { 13 i++; 14 } while(a[i]<p); 15 do { 16 j--; 17 } while(a[j]>p); 18 if(i>=j)return j; 19 swap(a[i],a[j]); 20 } 21 } 22 23 void mysort(int a[], int lo, int hi) { 24 if(lo>=hi)return; 25 int i = mypartition(a, lo, hi); 26 mysort(a, lo, i); 27 mysort(a, i+1, hi); 28 } 29 30 int main() { 31 int n,m; 32 while(scanf("%d%d",&n,&m)!=EOF) { 33 for(int i=0; i<n; i++) scanf("%d",&a[i]); 34 mysort(a,0,n-1); 35 if(m>0)printf("%d",a[n-1]); 36 for(int i=1; i<m; i++) { 37 printf(" %d",a[n-1-i]); 38 } 39 puts(""); 40 } 41 return 0; 42 }