C代码学习,快速排序,左右并进,递归调用(另注释)

以下是参考快速排序代码。原来文章没有注释,我在这里增加了详细的注释,希望看到博客的新手能够理解这种排序方式,左右并进,递归调用,速度很快
 
  
#include //头文件
7 #include //时间函数文件
8
9 #define MAX 10
10 #define SWAP(x, y) {int t=x; x=y; y=t;}//定义一个交换函数,让两个整形数进行交换
11
12 void quickSort(int *a, int left, int right);//声明函数,参数为数组地址和左右部分
13
14 int main(void)
15 {
16 int a[MAX] = {0};//定义一个数组a[10]
17 int i;
18
19 srand(time(NULL));//一个时间的随机种子
20
21 printf("排序前:\n");
22 for (i=0; i23 {
24 a[i] = rand()%100;
25 printf("%d ", a[i]);
26 }
27
28 quickSort(a, 0, MAX-1);//排序,传递数组首地址,和起始位置与结束位置,函数实现见下面
29
30 printf("\n排序后:\n");
31 for (i=0; i32 {
33 printf("%d ", a[i]);
34 }
35 printf("\n");
36
37 return 0;
38 }
39
40 void quickSort(int *a, int left, int right)
41 {
42 if (left < right)//设置边界条件
43 {
44 int t = a[(left+right)/2];//取中间的数字
45 int i = left - 1;//起始位置-1
46 int j = right + 1;//结束位置+1
47
48 while (1)//当i=j时候跳出循环
49 {
50 while (a[++i] < t);//左边的小于中间值,就增加左边的位置坐标,目标找到大于或者等于中间值的数字位置
51 while (a[--j] > t);右边的大于中间值,左边找到了,找右边,右边找比中间值小的或者等于的数字位置
52
53 if (i >= j)//找到异于大小关系的连个坐标后,判断一下,是到了中间位置,还是左边大于右边了,如果是停止,如果不是也就是小于中间数的数字和大于中间数的数字的数都在右边,这时候交换连个数字//经过观察i>j不可能只是i=j就跳出while(1)循环了。
54 {
55 break;
56 }
57 SWAP(a[i], a[j]);//不满足i>=j的时候交换两个数字
58 
59 }
60 //这里开始自己调用自己,来排序左边的和右边的,此时,左边的都<右边的,但是左边的是无序的,右边的是无序的,递归调用,这样左右都有序了
61 quickSort(a, left, i-1);//递归调用,使用此函数来排序左边的数据,此时i是中间数
62 quickSort(a, j+1, right);//递归调用右边的让其排序,j也是中间数
63 }
64 }

你可能感兴趣的:(C&C++)