算法与数据结构——排序(二)冒泡排序(下)
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).