快排 快速排序 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 }
View Code

 

另一种快排,和最上面那个差不多,据说算导的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 }
View Code

 

posted @ 2015-04-13 23:40  带鱼Yuiffy  阅读(722)  评论(0编辑  收藏  举报