简单排序
2016-06-17 20:50
155 查看
**********简单排序********
对于语言的学习排序就少了,很常见就是将数据排序,我们知道的排序很多,例如:冒泡排序、直接排序、选择排序、希尔排序、插入排序、堆排序等。
今天我们就针对我们最经典的冒泡排序,直接排序,选择排序。对于后面的
排序我会一一列举。
-------冒泡排序--------
冒泡排序的基本思想:(以升序排列为例)相邻的两个数进行比较,将较小的数上浮,大数下沉。
int main () { int a[7]={5,2,9,10,3,7,1}; int len = sizeof(a)/sizeof(a[0]);//测数组的长度 int i = 0; int j = 0; int tmp=0; //空瓶子,用于交换数组 for(j = 0;j < len ;j ++)//比较多少趟 { for(i =0;i < len-j-1 ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次 { //每趟的比较 if(a[i] > a[i+1]) { tmp = a[i]; a[i]=a[i+1]; a[i+1]=tmp; } } } for(i =0;i < len ; i ++) { printf("%d ",a[i]); } return 0 ; }简单的冒泡排序,
但是,问题来了,当你的一堆数相对比较整齐的时候我们就简化一下代码达到c语言学习的简洁,高效。
优化代码,也就是加个标志,如果一次进去没有做过交换,那我们就不用再继续下一趟的比较,达到了
代码的高效,简洁。
int main () { int a[7]={5,2,9,10,3,7,1}; int len = sizeof(a)/sizeof(a[0]);//测数组的长度 int i = 0; int j = 0; int tmp=0; //空瓶子,用于交换数组 bool flag = true;//一个标志 int count = 0; for(j = 0;j < len ;j ++)//比较多少趟 { flag = true;//判断完了,就恢复真 for(i =0;i < len-j-1 ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次 { //每趟的比较 if(a[i] > a[i+1]) { count ++; tmp = a[i]; a[i]=a[i+1]; a[i+1]=tmp; flag = false;//交换过了就返回false,标志交换过。 } } if(flag) { break; } } for(i =0;i < len ; i ++) { printf("%d ",a[i]); } return 0 ; }当你的数相对比较整齐时,就count明显看出来了那个效率
--------交换排序----------
交换排序的基本思想:(以升序排列为例) <strong>两两数进行比较,将较小的数前去,大数后换</strong>。
</pre><pre name="code" class="html"><img src="http://img.blog.csdn.net/20160617230815390?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
*/ int main () { int a[7]={5,2,9,10,3,7,1}; int len = sizeof(a)/sizeof(a[0]);//测数组的长度 int i = 0; int j = 0; int tmp=0; //空瓶子,用于交换数组 for(j = 0;j < len ;j ++)//比较多少趟 { for(i =j;i < len ;i++)//第一次少比较0个;第二次少比较1个;第三次少比较2个....第i次就少比较i次 { //每趟的比较 if(a[j] >a[i]) { tmp = a[j]; a[j]=a[i]; a[i]=tmp; } } } for(i =0;i < len ; i ++) { printf("%d ",a[i]); } return 0 ; }----------选择排序------------
选择排序的基本思想:(以升序排列为例)
这次就不用比较交换,只是将小数的下标存起来,到时候就把它放在合适的位置就行。
int main () { int a[7]={5,2,9,10,3,7,1}; int len = sizeof(a)/sizeof(a[0]);//测数组的长度 int i = 0; //每趟交换的次数 int j = 0; //比较躺数 int tmp=0; //空瓶子,用于交换数组 int min_index =0;//记录最小的数的下标 int min = a[0]; //记录最小值 for(j = 0;j < len-1 ;j ++)//比较多少趟 { min_index =j;//每次比较完以后,就把那个数给释放掉,把下一个数开始作为最小值,最小值下标。 min = a[j];// for(i =j+1;i < len ;i++)//当你把这个数比较完以后,下次就少一个数, { //j+1:表示:j=0时,最小值从1开始 if(min >a[i]) // j=1时,最小值从2开始,第一次已经把那个最小值放在1的位置了下次肯定就不比较了从下一项开始 { // .......... min=a[i]; min_index=i; } } if (j != min_index)//每趟的最小值,就放在这第j趟的开始,在做交换 { tmp=a[j]; a[j]= a[min_index]; a[min_index] = tmp; } } for(i =0;i < len ; i ++) { printf("%d ",a[i]); } return 0 ; }
ok,现在只介绍这三个排序方式,以后会讲很多!
相关文章推荐
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
- FZU 2227 邮票【离散化+欧拉路径】
- C++补交实验二
- Redis入门级指南---客户端命令基本操作
- STL之vector的内存
- Q391判断是否为平衡二叉树(递归实现)
- 补C++ 2
- MongoDB中的一致性总结
- 非银行支付机构网络支付业务管理办法对第三方支付账户的影响
- Java多线程编程核心技术---线程间通信(二)
- 内存的分配
- IOC_bean容器初始化
- poj3691(ac自动机+dp)
- lnmp上部署微信公众号项目注意事项
- Java多线程编程核心技术---线程间通信(一)
- 实验四主存空间的分配和回收
- js变量数据类型分类
- IOC(注解)
- SPI总线与I2C总线
- FileUpload系列:(3)文件上传和下载示例