冒泡算法的优化

来源:互联网 发布:乐视电视如何设置网络 编辑:程序博客网 时间:2024/04/30 11:31

 冒泡算法的主要思想:

      冒泡排序和插入排序相类似,都是简单的排序算法 ,时间复杂度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,就说明已经排好序了,停止继续排序,不然进行下一趟排序。

 

具体代码:

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击