冒泡排序和选择排序
2014-03-08 10:41
357 查看
冒泡排序(Bubble sort)和选择排序(Selection sort)
初看冒泡排序和选择排序不禁会问它们有什么区别? 的确, 它们的基本思想是一样的. 都是通过一轮的循环找到所要排序数中的最值(最大值或最小值), 然后将最值置于顶端. 它们的区别主要体现在对其他数(非最值)的处理上.
冒泡排序: 通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 例如, 要求从小到大排序. 通过将两个数比较, 将较大的数置换到右边. 如此不断循环将得到最值.
选择排序: 和冒泡排序不同, 选择排序使用标记最值所在位置的方式, 查找最值过程中不移动数位置, 只是在最后将最值置换到顶端.
冒泡排序代码:
选择排序代码:
从上两段代码可以看出,它们处于同一个数量级,即时间复杂度是相同的,都用了两层循环,为O(n^2)(n:排序个数); 但是内层循环中,冒泡排序的互换位置的操作从概率上讲要明显多于选择排序. 整个排序算法,选择排序换位操作为O(n),二冒泡排序为O(n^2/2). 所以综合来讲选择排序的时间效率要高于冒泡排序.
初看冒泡排序和选择排序不禁会问它们有什么区别? 的确, 它们的基本思想是一样的. 都是通过一轮的循环找到所要排序数中的最值(最大值或最小值), 然后将最值置于顶端. 它们的区别主要体现在对其他数(非最值)的处理上.
冒泡排序: 通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 例如, 要求从小到大排序. 通过将两个数比较, 将较大的数置换到右边. 如此不断循环将得到最值.
选择排序: 和冒泡排序不同, 选择排序使用标记最值所在位置的方式, 查找最值过程中不移动数位置, 只是在最后将最值置换到顶端.
冒泡排序代码:
void bubblesort(int arrayVal[],int length) { int i,j; int temp; for(i=0;i<length-1;i++) for(j=i+1;j<length;j++) if(arrayVal[i]>arrayVal[j]) { //置换位置 temp=arrayVal[i]; arrayVal[i]=arrayVal[j]; arrayVal[j]=temp; } }
选择排序代码:
void selectionsort(int arrayVal[],int length) { int i,j,max; int temp; for(j=length;j>1;j--) { max=0;//标记最值位置 for(i=1;i<j;i++) if(arrayVal[i]>arrayVal[max]) max=i; if(max!=j-1) { temp=arrayVal[max]; arrayVal[max]=arrayVal[j-1]; arrayVal[j-1]=temp; } } }
从上两段代码可以看出,它们处于同一个数量级,即时间复杂度是相同的,都用了两层循环,为O(n^2)(n:排序个数); 但是内层循环中,冒泡排序的互换位置的操作从概率上讲要明显多于选择排序. 整个排序算法,选择排序换位操作为O(n),二冒泡排序为O(n^2/2). 所以综合来讲选择排序的时间效率要高于冒泡排序.
相关文章推荐
- 从C源代码到可执行文件的总体过程框架
- 向文件尾插入内容
- hibernate--HQL语法与详细解释
- SQLSERVER数据库学习总结七(视图,索引)
- 正则表达式30分钟入门教程
- 用STL实现单词统计功能
- 路虎揽胜柴油发动机解析
- linux下的串口工具
- 结构体和枚举处理点的问题
- Thinking in C++读书笔记(四)---数据抽象
- 路虎SUV,自信与硬朗的超前设计
- java堆栈
- Windows CE 系统中的同步机制
- 构建一个类,对集合进行运算,包括求集合的交集,并集和差集。
- 日期时间正则表达式(亲测有用)
- 如何彻底关闭Win8应用
- 腾讯技术分享实录:游戏后台开发九问
- Box2d学习笔记三:box2d中几个重要的类
- PAT Basic Level 1021. 个位数统计 (15)
- 通过java得到windows的磁盘空间大小