zoukankan      html  css  js  c++  java
  • 冒泡排序

    算法思想

    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))。其他情况下,几乎总是(Oleft(n^{2} ight))

    优化

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

    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
    
  • 相关阅读:
    __module__ 和 __class__
    __str__ 和 __repr
    __getitem__ __setitem__ __delitem__ 使用
    授权
    __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)
    __import__
    hasattr getattr setattr delattr --> (反射)
    类三大特性(继承 多态 封装)
    静态方法@staticmethod
    类方法@classmethod
  • 原文地址:https://www.cnblogs.com/chay/p/10672830.html
Copyright © 2011-2022 走看看