代码改变世界

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

2012-10-24 07:43  左眼微笑右眼泪  阅读(294)  评论(0编辑  收藏  举报

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

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