排序算法之冒泡排序
2015-12-30 22:24
232 查看
冒泡排序应该是大家比较熟悉的排序方法之一,但是确是一个效率不是太高的排序算法,特别是面对大数据集的时候。
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |
第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三趟排序(外循环)
第一次两两比较2 > 1交换
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第二次两两比较,2 < 4不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第四趟排序(外循环)无交换
第五趟排序(外循环)无交换
[b][b][/b][/b]
排序完毕,输出最终结果1 2 4 5 6 9
javascript实现的的代码如下:
参考:http://www.cnblogs.com/kkun/archive/2011/11/23/2260280.html
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子
例子为从小到大排序,
原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |
第一趟排序(外循环)
第一次两两比较6 > 2交换(内循环)
交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |
第二次两两比较,6 > 4交换
交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |
第三次两两比较,6 > 1交换
交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |
第四次两两比较,6 > 5交换
交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第五次两两比较,6 < 9不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循环)
第一次两两比较2 < 4不交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |
第二次两两比较,4 > 1交换
交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第四次两两比较,5 < 6不交换
交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
第三趟排序(外循环)
第一次两两比较2 > 1交换
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第二次两两比较,2 < 4不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第三次两两比较,4 < 5不交换
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |
第四趟排序(外循环)无交换
第五趟排序(外循环)无交换
[b][b][/b][/b]
排序完毕,输出最终结果1 2 4 5 6 9
javascript实现的的代码如下:
<html> <head> <title>Date Example</title> </head> <body> <div id="content"></div> <script type="text/javascript"> function CArray (numElements){ this.dataStore = []; this.pos = 0; this.numElements = numElements; this.insert = function (element){ this.dataStore[this.pos++] = element; }; this.toString = function (){ var restr = ""; for (var index = 0; index < this.dataStore.length; ++index){ restr += this.dataStore[index] + " "; if (index > 0 && index % 10 == 0){ restr += "\n"; } } return restr; }; this.clear = function (){ for (var index = 0; index < this.dataStore.length; ++index){ this.dataStore[index] = 0; } }; this.setData = function (){ for (var index = 0; index < this.numElements; ++index){ this.dataStore[index] = Math.floor(Math.random() * (this.numElements + 1)); } }; this.swap = function (arr, index1, index2){ var tempData = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tempData; }; // 冒泡排序 this.bubbleSort = function (){ var numLength = this.numElements; for (var outer = numLength; outer >= 2; --outer){ for (var inner = 0; inner <= (numLength -1); ++inner){ if (this.dataStore[inner] > this.dataStore[inner + 1]){ this.swap(this.dataStore, inner, (inner + 1)); } } console.log(this.toString()); // 查看排序过程 } }; } var numElements = 10; var myNums = new CArray(numElements); myNums.setData(); console.log(myNums.toString()); myNums.bubbleSort(); console.log(myNums.toString()); </script> </body> </html>
参考:http://www.cnblogs.com/kkun/archive/2011/11/23/2260280.html
相关文章推荐
- Python遍历文件,正则选取汉字便于多语言支持
- (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
- Replace '*'of string
- tar 解压
- 菜鸟猿大战Java之IO系列(一)
- 几种定位方式的总结
- linux:vim-abolish 的安装和使用
- 技术架构选型
- [Javascript] Array methods in depth - indexOf
- 【OpenCV学习笔记】7.4仿射变换warpAffine()
- 【学神-RHEL7】1-28-mariadb数据库自动备份和expect的使用
- LedPedometer-3.注册界面和Android随机生成图片验证码
- ubuntu 14.04 64位 安装Opencv3.1.0 (包含opencv_contrib模块)
- [LeetCode]#6 ZigZag Conversion
- 电子证书 DER vs. CRT vs. CER vs. PEM
- [python]Win7 X64安装python Scrapy【解决windows c++环境】
- css媒体查询之width
- 多线程下载
- JSP中两种include的区别
- 多行文本溢出显示省略号(...)的方法