1 /**************************************************************************************
2 * Function : 快速排序
3 * Create Date : 2014/04/21
4 * Author : NTSK13
5 * Email : beijiwei@qq.com
6 * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
7 * 任何单位和个人不经本人允许不得用于商业用途
8 * Version : V0.1
9 ***************************************************************************************
10 基础算法之排序--快速排序 3 1 7 5 8 4 9 0 2 6
11
12 步骤:
13 1)选取base 为最左边的3,最小序号为0(left=0),最大序号为9(right=9)
14
15 2)从最右边开始,向左查找到第一个小于base的数字,序列号为j,放在序号为0的位置,也就是取得base值的位置.
16 3)从最左边开始,向右查找到第一个大于base的数字序列号为i,放在上次查找小于base的位置,序列号j
17
18 4)循环执行 步骤2) 和 步骤 3) ,直到 i >= j. 此时序列号i的左侧全是小于base的数, 序列号i的右侧全是大于base的数,
19
20 5)把base值放在序列号为i的位置
21
22 6)分别递归调用left到 i-1, i+1到 right 进行快排
23
24 注意 left小于right 是可以进行递归的条件.
25
26 **************************************************************************************/
27 #include<stdio.h>
28
29 #define MY_FUNC 1
30 #if MY_FUNC
31
32 #define M 10
33 int data[M]={0};
34
35 void quick_sort(int array[],int left,int right);
36
37 // The first method:
38 int main()
39 {
40 int i=0;
41
42 freopen("input.txt","r",stdin);
43
44 for(i=0;i<M;i++)
45 scanf("%d",&data[i]); // get input data
46
47 printf("Before quick sort : \n");
48 fflush(stdout);
49
50 for(i=0;i<M;i++) {
51 printf("%d \t",data[i]);
52 fflush(stdout);
53 }
54
55 quick_sort(data,0,M-1);
56
57 printf("\nAfter quick sort : \n");
58 fflush(stdout);
59
60 for(i=0;i<M;i++) {
61 printf("%d \t",data[i]);
62 fflush(stdout);
63 }
64
65 return (0);
66 }
67
68 void quick_sort(int array[],int left,int right)
69 {
70 int base=array[left];//选定base
71 int i=left;//左侧序号
72 int j=right;//右侧序号
73
74 if(left < right)
75 {
76 while(i<j)
77 {
78 //注意下边while循环里 i<j是必须加入的
79 while(i<j && array[j]>base)//right --> left 从数组最右侧 开始往左找比base小的数; 如果找到的话,放在最左边
80 j--;
81 array[i]=array[j];
82
83 //注意下边while循环里 i<j是必须加入的
84 while(i<j && array[i]<base)//left -->right 从数组最左侧 开始往 找比base大的数; 如果找到的话,放在最右边
85 i++;
86 array[j]=array[i];
87 }
88 array[i]=base;
89
90 quick_sort(array,left,i-1);
91 quick_sort(array,i+1,right);
92 }
93
94 }
95
96 /********************************************my function end**************************************************/
97 #else
98
99 #define M 10
100 int data[M]={0};
101
102 int division(int a[],int left,int right);
103 void quick_sort(int a[],int left,int right);
104
105 // The second method:
106 int main()
107 {
108 int i=0;
109
110 freopen("input.txt","r",stdin);
111
112 for(i=0;i<M;i++)
113 scanf("%d",&data[i]); // get input data
114
115 printf("Before quick sort : \n");
116 fflush(stdout);
117
118 for(i=0;i<M;i++) {
119 printf("%d \t",data[i]);
120 fflush(stdout);
121 }
122
123 quick_sort(data,0,M-1);
124
125 printf("\nAfter quick sort : \n");
126 fflush(stdout);
127
128 for(i=0;i<M;i++) {
129 printf("%d \t",data[i]);
130 fflush(stdout);
131 }
132
133
134 return (0);
135 }
136
137
138 int division(int a[],int left,int right)
139 {
140 int base=a[left];
141 while(left<right)
142 {
143 while(left<right && a[right]>base)
144 --right;
145 a[left]=a[right];
146 while(left<right && a[left]<base)
147 ++left;
148 a[right]=a[left];
149 }
150 a[left]=base;
151 return left;
152
153 }
154 void quick_sort(int a[],int left,int right)
155 {
156 int i=0;
157 if(left<right)
158 {
159 i=division(a,left,right);
160 quick_sort(a,left,i-1);
161 quick_sort(a,i+1,right);
162 }
163 }
164
165 #endif
166
167