现在的位置: 首页 > 综合 > 正文

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

2013年03月20日 ⁄ 综合 ⁄ 共 815字 ⁄ 字号 评论关闭

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

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

抱歉!评论已关闭.