冒泡排序

算法思想

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动画演示:

实现

C++

void bubbleSort(vector<int> &array)
{
	int len = array.size();

	for (int i = len - 1; i>0; i--)
		for (int j = 0; j<i; j++)
			if (array[j] > array[j + 1])
				swap(array[j], array[j + 1]);
}

python

def BubbleSort(alist):
    leng = len(alist)
    #需要循环的次数:n-1
    for index in range(leng-1,0,-1):
        # 每次循环将当前的最大值放在合适的位置上
        for i in range(index):
            if alist[i] >  alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]

总结

稳定性:
在相邻元素相等时,它们并不会交换位置,所以,冒泡排序是稳定排序

适用场景:
冒泡排序思路简单,代码也简单,特别适合小数据的排序。但是,由于算法复杂度较高,在数据量大的时候不适合使用。
算法在数据基本有序的情况下,性能最好。

复杂度:
在数据完全有序的时候展现出最优时间复杂度为\(O(n)\)。其他情况下,几乎总是\(O\left(n^{2}\right)\)

优化

增加一个的标志,当前一轮没有进行交换时,说明数组已经有序,没有必要再进行下一轮的循环了,直接退出:

C++

void shortBubbleSort(vector<int> &array)
{
	bool exchanges = true;
	int len = array.size();

	for (int i = len - 1; i>0 && exchanges; i--)
	{
		exchanges = false;
		for (int j = 0; j<i; j++)
		if (array[j] > array[j + 1])
		{
			swap(array[j], array[j + 1]);
			exchanges = true;
		}
	}
}

python

def shortBubbleSort(alist):
    exchanges = True
    passnum = len(alist) - 1

    while passnum  > 0 and exchanges:
        exchanges = False
        for i in range(passnum):
            if alist[i] > alist[i+1]:
                exchanges = True
                alist[i],alist[i+1] = alist[i+1],alist[i]
        passnum -= 1
posted @ 2019-04-08 19:31  youngliu91  阅读(198)  评论(0编辑  收藏  举报