您的位置:首页 > 编程语言

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

2015-07-23 11:41 302 查看
以下是参考快速排序代码。原来文章没有注释,我在这里增加了详细的注释,希望看到博客的新手能够理解这种排序方式,左右并进,递归调用,速度很快
#include <stdio.h>//头文件7 #include <time.h>//时间函数文件89 #define MAX 1010 #define SWAP(x, y) {int t=x; x=y; y=t;}//定义一个交换函数,让两个整形数进行交换1112 void quickSort(int *a, int left, int right);//声明函数,参数为数组地址和左右部分1314 int main(void)15 {16     int a[MAX] = {0};//定义一个数组a[10]17     int i;1819     srand(time(NULL));//一个时间的随机种子2021     printf("排序前:\n");22     for (i=0; i<MAX; i++)//使用种子生成10个0-99的数字,存在a数组里23     {24         a[i] = rand()%100;25         printf("%d ", a[i]);26     }2728     quickSort(a, 0, MAX-1);//排序,传递数组首地址,和起始位置与结束位置,函数实现见下面2930     printf("\n排序后:\n");31     for (i=0; i<MAX; i++)32     {33         printf("%d ", a[i]);34     }35     printf("\n");3637     return 0;38 }3940 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;//起始位置-146         int j = right + 1;//结束位置+14748         while (1)//当i=j时候跳出循环49         {50             while (a[++i] < t);//左边的小于中间值,就增加左边的位置坐标,目标找到大于或者等于中间值的数字位置51             while (a[--j] > t);右边的大于中间值,左边找到了,找右边,右边找比中间值小的或者等于的数字位置5253             if (i >= j)//找到异于大小关系的连个坐标后,判断一下,是到了中间位置,还是左边大于右边了,如果是停止,如果不是也就是小于中间数的数字和大于中间数的数字的数都在右边,这时候交换连个数字//经过观察i>j不可能只是i=j就跳出while(1)循环了。54             {55                 break;56             }57             SWAP(a[i], a[j]);//不满足i>=j的时候交换两个数字
5859         }60 //这里开始自己调用自己,来排序左边的和右边的,此时,左边的都<右边的,但是左边的是无序的,右边的是无序的,递归调用,这样左右都有序了61         quickSort(a, left, i-1);//递归调用,使用此函数来排序左边的数据,此时i是中间数62         quickSort(a, j+1, right);//递归调用右边的让其排序,j也是中间数63     }64 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: