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 }
相关文章推荐
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 手机站百度地图一键导航代码
- 中文化和国际化问题权威解析之三:Java中文问题分析
- Golang Channel用法简编
- 中文化和国际化问题权威解析之二:Java国际化基础
- leetcode 日经贴,Cpp code -Search a 2D Matrix II
- VS2013 配置全局 VC++ 目录
- C#之IO读写文件方法封装代码
- python 机器学习库:Numpy
- 如何准确判断邮件地址是否存在
- php获取html上传图片并保存至本地服务器
- Goroutine(协程)为何能处理大并发?
- 贝叶斯的JAVA分类器实现
- Java设计模式 Bridge(桥接)Adapter,command,State,Mediator,Facade
- Java中JDK的安装和path,classpath的环境配置 Android集成开发环境配置
- Java调用动态库方法说明
- 中文化和国际化问题权威解析之一:字符编码发展历程
- php curl
- C# WinForm动态调用远程Web服务
- c#高级编程第七版 学习笔记 第一章 .NET体系结构