原文转自:http://blog.csdn.net/lengyuhong/article/details/4659552
冒泡算法的主要思想:
冒泡排序和插入排序相类似,都是简单的排序算法 ,时间复杂度O(N^2)
算法思想:
1) 有n个数(存放在数组a[0]-a[n-1]中),第一趟将每相邻两个数比较,小的换到前面,经n-1次两两相邻比较后,最大的数已经“沉底”,放到最后的一个位置,小数上升“浮起”
2) 第二趟对余下的n-1个数(最大的数已经“沉底”),按上法比较,经n-2次两两比较之后得次大的数
3) 依此推算,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较
算法实现代码:
问题:
但如果只是这样单纯实现方法,会有些浪费。即如果一些数组,它进行过几趟之后,就已经完全排好序了,但根据这个还要继续在进行排序,这样会非常浪费。
如1,2,3,4,5,6,7,8,9,10,进行一趟排序之后就已经拍好序,但程序还要在进行多趟排序
解决方案:
在进行一趟比较排序之后,马上就判断一下这个数组是否已经排好序了,如果已经排好了,那就直接退出。
判断是否已经排好序了的函数isSorted()
从0-n-1,只要有一个数不符合排序规矩,就说明这个数还没有排好序
更好的解决方案(更新时间:2009年10月18日19:57:38)
前者的确是解决判断是否已经排好序的问题,但如果这n个数要经历所有的排序之后才能达到要求,这样反而使得这样的排序方法变得效率更差。
其实我可以使用标记的方法
在函数中定义一个bool 的变量 issorted ,在每趟对剩余的数字排序时,先把它设为true,然后当发生两个两个相邻的数没有按要求排时,在交换这两个数的同时,把issorted设为false,不然就一直保持为true。
在进行好一趟排序之后,测试issorted这个变量的值,如果保持true,就说明已经排好序了,停止继续排序,不然进行下一趟排序。
具体代码:
原文转自:http://blog.csdn.net/lengyuhong/article/details/4659552