• 算法与数据结构——排序(二)冒泡排序(下)


          在上一篇里面说了,正宗的冒泡排序是相邻的两个数进行比较,如果符合条件,那么就进行交换,这样第一次比较完成后的结果可以对第二次比较有帮助。在有很多数据的时候,这种排序算法的效率会高一些。但是这种算法还有没有改进的地方呢?

          我们会发现,如果把一个有序的序列用这种方法去进行排序,它比较的次数并没有减少。其实经过第一次比较,如果没有一次数据的交换,我们就可以断定这个序列是有序的,后面就根本不需要再进行比较了。明白了这点后,我们就可以设置一个标记,它初始化为False,如果有某一次比较,没有一次数据进行交换的话,那么就可以断定这个序列目前是有序的,这时候把这个标记设置为True,后面就不需要再再进行比较,循环中止。具体代码参考下面的(代码跟前面的解释有一些不同,不过思想是一样的):

    public List<int> BetterBubleSort(List<int> sortList)
         {
             for (int i = 0; i < sortList.Count; i++)
             {
                 bool flag = true;
                 for (int j = 0; j < sortList.Count - i - 1; j++)
                 {
                    
                     if (sortList[j] > sortList[j + 1])
                     {
                         int temp = sortList[j];
                         sortList[j] = sortList[j + 1];
                         sortList[j + 1] = temp;
     
                         flag = false;
                     }
                    
                 }
                 if (flag)
                 {
                     break;
                 }
     
             }
             return sortList;
         }

         冒泡算法就说到这里了,下面来看一下冒泡算法的时间复杂度。

         由最后改进的代码可知,如果是最好的情况,序列是有序的,那么只需要进行n-1次比较就行了,没有数据的移动,这时的时间复杂度是O(n),最坏的情况,也就是逆序时,这时候,需要比较(n-1)+(n-2)+(n-3)……3+2+1=n(n-1)/2,数据也要移动这么多次,所以最坏的情况,时间复杂度为O(n^n).

  • 相关阅读:
    要坚持的好习惯
    Attribute与Property关系
    浅谈ES6中super关键字
    JS权威指南读书笔记(七)
    JS权威指南读书笔记(六)
    JS权威指南读书笔记(五)
    JS权威指南读书笔记(四)
    函数
    对象
    数值
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2736508.html
Copyright © 2020-2023  润新知