zoukankan      html  css  js  c++  java
  • 算法与数据结构——排序(二)冒泡排序(下)

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

          我们会发现,如果把一个有序的序列用这种方法去进行排序,它比较的次数并没有减少。其实经过第一次比较,如果没有一次数据的交换,我们就可以断定这个序列是有序的,后面就根本不需要再进行比较了。明白了这点后,我们就可以设置一个标记,它初始化为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).

  • 相关阅读:
    Linux常用命令(第二版) --系统开关机命令
    Linux常用命令(第二版) --网络通信命令
    Linux常用命令(第二版) --压缩解压缩命令
    Linux常用命令(第二版) --帮助命令
    Linux常用命令(第二版) --文件搜索命令
    Linux常用命令(第二版) --权限管理命令
    Linux常用命令(第二版) --文件管理命令
    程序员练级之路 (作者:陈皓)
    我的算法学习之路
    Linux学习笔记 --服务器优化
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2736508.html
Copyright © 2011-2022 走看看