排序——冒泡排序

1. 简介

1.1 概念

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。遍历数列的工做是重复地进行直到没有再须要交换,也就是说该数列已经排序完成。这个算法的名字由来是由于越小的元素会经由交换慢慢“浮”到数列的顶端。算法

1.2 步骤

冒泡排序算法的运做以下:数组

  • 比较相邻的元素。若是第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。这步作完后,最后的元素会是最大的数。
  • 针对全部的元素重复以上的步骤,除了最后一个。
  • 持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。

1.3 分析

  • 最优时间复杂度:O(n) (表示遍历一次发现没有任何能够交换的元素,排序结束。)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定

1.4 优化

  • 添加 flag 参数优化

  • 记录上次交换的位置spa

  • 鸡尾酒排序code

    • 鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不一样之处在于从低到高排而后从高到低,而冒泡排序则仅从低到高去比较序列中的每一个元素,能够获得比冒泡排序稍微好一点的效能。
    • 最差时间复杂度O(n^2)
    • 最优时间复杂度-若是序列在一开始已经大部分排列过的话,会接近o(n)
    • 平均复杂度-O(n^2)

2. 代码实例

def sort(a):
for i in range(len(a)-1, 0, -1):
    for j in range(i):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]

# 优化1: 添加标记flag, 若是内循环中的判断没有执行,表示已经数组是排序好的,直接退出循环便可
def sort_better1(a):
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True   #若是下面的循环中的判断没有执行,表示已经数组是排序好的,直接退出循环便可
        for j in range(i):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
        print(a)
        if flag:
            break

# 优化2:记录上次最后一次交换元素的位置,那么次位置以后的就是已经排序好的,下次遍历的时候就不须要再遍历此位置以后的元素
def sort_better2(a):
    last_position = len(a) - 1
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True
        index = 0
        for j in range(last_position):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
                index = j
        print(a)
        if flag:
            break
        last_position = index
# 优化3: 鸡尾酒排序  鸡尾酒排序,即双向的冒泡排序,等因而冒泡排序的轻微变形。不一样的地方在于从低到高而后从高到低
#(有前后顺序,并不是同时;大循环下第一个循环是从开始扫到结束,将最大的归到最后;第二个循环是从倒数第二个位置往开始端扫,将最小的归到开始的位置)        
def sort_better3(a):
    last_position = len(a) - 1
    for i in range(len(a)-1, 0, -1):
        print("i------" + str(i))
        flag = True
        index = 0
        for j in range(last_position):
            print("j------" + str(j))
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                flag = False
                index = j
        last_position = index
        for k in range(last_position, 0, -1):
            print("k------" + str(k))
            if a[k] < a[k-1]:
                a[k], a[k-1] = a[k-1], a[k]
                flag = False
        print(a)
        if flag:
            break
  
li = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort(li)
print(li)
a = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better1(a)
#print(a)
b = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort_better2(b)
print(b)
c = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better3(c)
#print(c)复制代码
相关文章
相关标签/搜索