冒泡排序
2016-03-30 01:28
225 查看
什么是冒泡排序?
比如对于一个无序的数组,想让它从小到大排列,则使用冒泡的排序规则如下:
1.将第一个元素和第二个元素进行对比,如果第一个元素大于第二个,则将二者进行交换,反之,则不用交换
2.当第一步比较完之后,对第二个元素和第三个以同样的规则进行比较,依次类推,最终的结果就是这一轮比较中最大的那个数被移动到了最后的位置,符合我们的预期目的
3.进行完第一轮比较,开始第二轮,依然是在第一个元素的位置开始比较,同样的规则,但是这一次只需要比较到倒数第二个元素,因为最后的那个已经被第一轮的最大数给占据着,无需再与它比较。
4.经过第二轮,倒数第二大的数也被拿出来了,并且移动到了数组倒数第二的位置,以此类推,再进行多轮直到结束,得到一个从小到大的数组。
以下是冒泡排序代码:
排序测试:
![](http://img.blog.csdn.net/20160330012250035?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
控制台打印如下:
1 2 3 4 5 6 7 8 9
注:可以看到,finishKey初始化值是数组的最后一个下标,因为这个时候还没进行循环比较,所以第一轮应该是要比较到数组最后一个的位置的,接下来,当进行完第一轮之后,finishKey减一,所以第二轮根据changeKey<finishKey只比较到数组的倒数第二个元素的位置就够了。直到finishKey等于2的时候,这个时候是最后一轮比较,第一个元素和第二个元素进行比较,比较完之后就退出循环,得到最终结果。
冒泡排序的比较次数:
假如数组有N个元素,则第一轮需要比较N-1次,第二轮需要比较N-2次..依次类推,最终比较的次数为:
(N-1)+(N-2)+(N-3)+...1=N(N-1)/2次
所以算法作了约N^2次比较,由于在算法复杂度中常量要去掉,所以最终的时间复杂度为O(N^2)。
任何情况下,其实不止冒泡排序,只要有两层循环相互嵌套,则这个算法的时间复杂度一般为O(N^2)
比如对于一个无序的数组,想让它从小到大排列,则使用冒泡的排序规则如下:
1.将第一个元素和第二个元素进行对比,如果第一个元素大于第二个,则将二者进行交换,反之,则不用交换
2.当第一步比较完之后,对第二个元素和第三个以同样的规则进行比较,依次类推,最终的结果就是这一轮比较中最大的那个数被移动到了最后的位置,符合我们的预期目的
3.进行完第一轮比较,开始第二轮,依然是在第一个元素的位置开始比较,同样的规则,但是这一次只需要比较到倒数第二个元素,因为最后的那个已经被第一轮的最大数给占据着,无需再与它比较。
4.经过第二轮,倒数第二大的数也被拿出来了,并且移动到了数组倒数第二的位置,以此类推,再进行多轮直到结束,得到一个从小到大的数组。
以下是冒泡排序代码:
public void bubblesort(int a[]){ int changeKey; //作为正在进行交换的元素的下标 int finishKey; //作为排序结束的控制位 for(finishKey=a.length-1; finishKey>1; finishKey--){ //排序的上限,每一轮之后都要减一 for(changeKey=0; changeKey<finishKey; changeKey++){ //每轮排序中,元素从头到尾两两进行比较 if(a[changeKey] > a[changeKey+1]){ //如果上一个元素大于下一个,则进行交换 //交换 int temp = a[changeKey]; a[changeKey] = a[changeKey+1]; a[changeKey+1] = temp; } } } }
排序测试:
控制台打印如下:
1 2 3 4 5 6 7 8 9
注:可以看到,finishKey初始化值是数组的最后一个下标,因为这个时候还没进行循环比较,所以第一轮应该是要比较到数组最后一个的位置的,接下来,当进行完第一轮之后,finishKey减一,所以第二轮根据changeKey<finishKey只比较到数组的倒数第二个元素的位置就够了。直到finishKey等于2的时候,这个时候是最后一轮比较,第一个元素和第二个元素进行比较,比较完之后就退出循环,得到最终结果。
冒泡排序的比较次数:
假如数组有N个元素,则第一轮需要比较N-1次,第二轮需要比较N-2次..依次类推,最终比较的次数为:
(N-1)+(N-2)+(N-3)+...1=N(N-1)/2次
所以算法作了约N^2次比较,由于在算法复杂度中常量要去掉,所以最终的时间复杂度为O(N^2)。
任何情况下,其实不止冒泡排序,只要有两层循环相互嵌套,则这个算法的时间复杂度一般为O(N^2)
相关文章推荐
- mschapv2在Radius中的认证实现
- 软件测试(四)——Graph Coverage 作业
- mac 下如何切换jdk的版本
- HDU1372,BFS象棋马走日
- 排序算法大汇总
- Linux 一些基本指令简单使用记录
- POJ2480Longge's problem 欧拉函数
- 使用 toughcli 安装管理 toughradius
- web.xml中load-on-startup的作用
- 【MCP】Administering Visual Studio TFS 2012 Jump Start
- toughcli 介绍
- win10下安装Ubuntukylin+修复Ubuntu引导+双系统可选启动
- 只有webshell,一样可以做代理
- cf628B 求字符串的字串有多少个能整除4 (找规律)
- android性能优化笔记
- Python自动化 - Windows开发环境下提取修改过的文件并压缩上传到指定的FTP
- JS轮播代码
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
- [POJ 2531]Network Saboteur[DFS]
- 知识总结