冒泡排序

冒泡排序是一种交换排序什么是交换排序呢?答曰:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。冒泡排序的时间复杂度是O(n2)

算法思想

它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。

每次调整都是将最大的数沉到末尾。

动态效果示意图:

冒泡排序_第1张图片

假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。

代码:

# -*- coding:utf-8 -*-
def bubbleSort(input_list):
    '''
    函数说明:冒泡排序(升序)
    Parameters:
        input_list - 待排序列表
    Returns:
        sorted_list - 升序排序好的列表
    '''
    if len(input_list) == 0:
        return []
    sorted_list = input_list
    '''数组长度为n 一共进行n-1趟排序'''
    for i in range(len(sorted_list) - 1):
        print('第%d趟排序:' % (i + 1))
        '''每趟进行n-1次调整'''
        for j in range(len(sorted_list) - 1):
            '''每次调整都是把最大的数放在列表的后面'''
            if sorted_list[j + 1] < sorted_list[j]:
                sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
            print(sorted_list)
    return sorted_list

if __name__ == '__main__':
    input_list = [50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
    print('排序前:', input_list)
    sorted_list = bubbleSort(input_list)
    print('排序后:', sorted_list)

稳定性

排序算法的稳定性:通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

优化

对冒泡排序常见的改进方法是加入标志性变量exchange,用于标志某一趟排序过程中是否有数据交换。如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。

# -*- coding:utf-8 -*-

def bubbleSort(input_list):
    '''
    函数说明:冒泡排序(升序)
    Author:
        www.cuijiahua.com
    Parameters:
        input_list - 待排序列表
    Returns:
        sorted_list - 升序排序好的列表
    '''
    if len(input_list) == 0:
        return []
    sorted_list = input_list
    for i in range(len(sorted_list) - 1):
        '''设定标志位为false'''
        bChanged = False
        print('第%d趟排序:' % (i + 1))
        for j in range(len(sorted_list) - 1):
            if sorted_list[j + 1] < sorted_list[j]:
                sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
                '''只要调整了就是True'''
                bChanged = True
            print(sorted_list)
        '''如果在某一趟中一次都没有调整,说明已经完成了排序,以后不用调整了,直接退出'''
        if not bChanged:
            break
    return sorted_list

if __name__ == '__main__':
    input_list = [50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
    print('排序前:', input_list)
    sorted_list = bubbleSort(input_list)
    print('排序后:', sorted_list)

 

你可能感兴趣的:(基础算法)