快排的几种变形

 

快排的几种方式与思想可以用到很多地方,直接看代码:

View Code
  1 #include <stdio.h>
2 #include <stdlib.h>
3
4 /** AUTHOR: Mike Feng
5 * 快排,时间复杂度为O(nlgn),几种方法的实验,注意细节。
6 * 1,两边分别访问,交换;
7 * 2,一边访问,交换;
8 * 3,两边分别访问,替换;
9 * 4,随机生成界限点;
10 */
11
12 void print(int *a,int len)
13 {
14 int i;
15 for(i=0;i<len;i++)
16 printf("%d\t",a[i]);
17 printf("\n");
18 }
19
20 /*将数组a划分为两部分,使用交换完成,此方法没有使用任何额外的空间存放元素。前面的元素小于a[r-1],后面的元素大于a[r-1]*/
21 int partion(int *a,int p,int r)
22 {
23 int i,j,tmp;
24 i=p;
25
26 /*最后一个数作为分界点*/
27 j=r;/*j从r开始,因为有可能会直接返回r*/
28
29 while(j>i)
30 {
31 while(a[i-1]<a[r-1] && i<j)i++;
32 while(a[j-1]>a[r-1] && j>i)j--;
33 if(a[i-1]!=a[j-1])
34 {
35 tmp=a[i-1];
36 a[i-1]=a[j-1];
37 a[j-1]=tmp;
38 }
39 i++;/*防止相等时死循环*/
40
41 }
42 if(a[r-1]<a[j-1])/*因为分界点为最后元素,所以和大的交换*/
43 {
44 tmp=a[r-1];
45 a[r-1]=a[j-1];
46 a[j-1]=tmp;
47 }
48
49 return j;/*返回分界点,算法下标为1*/
50
51 }
52
53 /*直接替换*/
54 int partion_e(int *a,int p,int r)
55 {
56 int i,j;
57 i=p;
58
59 int x=a[r-1];/*最后一个数作为分界点*/
60 j=r;
61
62 while(j>i)
63 {
64 while(a[i-1]<=x && i<j)i++;
65 a[j-1]=a[i-1];
66
67 while(a[j-1]>x && j>i)j--;
68 a[i-1]=a[j-1];
69
70
71 }
72 a[i-1]=x;
73
74 return i;
75
76 }
77 /*交换,只从一边扫描*/
78 int partition(int *a,int p,int r)
79 {
80 int i=p-1,j,tmp;
81 for(j=p;j<r;j++)
82 {
83 if(a[j-1]<=a[r-1])/*处理有相同元素的情况,这里使用<=号来使i++*/
84 {
85 i++;
86 tmp=a[j-1];
87 a[j-1]=a[i-1];
88 a[i-1]=tmp;
89 }
90 }
91 if(a[r-1]<a[i])
92 {
93 tmp=a[r-1];
94 a[r-1]=a[i];
95 a[i]=tmp;
96 }
97
98 print(a,12);
99
100 return (i+1);/*算法下标从1开始,所以这里要加1*/
101 }
102
103 int randomized_patition(int *a,int p,int r)
104 {
105 int m=rand()%(r-p+1)+p;/*随机生成p到r之间的整数方法*/
106 int tmp;
107 tmp=a[r-1];
108 a[r-1]=a[m-1];
109 a[m-1]=tmp;
110
111 return partition(a,p,r);
112 // return partion(a,p,r);
113 }
114
115 int *quicksort(int *a,int p,int r)
116 {
117 int q;
118 if(p<r)
119 {
120 // q=partion(a,p,r);
121 // q=partion_e(a,p,r);
122 q=partition(a,p,r);
123 // q=randomized_patition(a,p,r);
124
125 quicksort(a,p,q-1);
126 quicksort(a,q+1,r);
127 }
128 return a;
129 }
130
131
132 int main(void)
133 {
134 int *b;
135 int a[]={1,2,4,33,44,12,13,123,53,129,41,3};
136 print(a,12);
137 // int a[]={44,12,13,123};
138
139 b=quicksort(a,1,12);
140
141 print(b,12);
142
143
144 return 0;
145 }

 

posted @ 2012-03-22 20:15  GOD!  阅读(267)  评论(0编辑  收藏  举报