冒泡排序法 及其优化

冒泡排序法 及其优化

冒泡排序法:

1.原理:比较两个相邻的元素,将值大的元素交换到右边

2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

    (1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。

    (2)比较第2和第3个数,将小数 放在前面,大数放在后面。

    ......

    (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成

    (4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。

    (5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。

    (6)依次类推,每一趟比较次数减少依次

def bubble_sort(our_list):
    """
    冒泡排序法
    """
    n = len(our_list)    
    for i in range(n):
        for j in range(n-i-1):
            # 如果前一个数比后一个数字大,则两个数字交换位置。 即大的往后放。
            if our_list[j]>our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
    return our_list
import random
a_list = [random.randint(1,100) for _ in range(10) ]
print(a_list)
print(bubble_sort(a_list))
[65, 13, 80, 19, 7, 11, 28, 54, 83, 41]
[7, 11, 13, 19, 28, 41, 54, 65, 80, 83]
def bubble_sort_2(our_list):
    """
    冒泡排序法 优化版本
    1、添加有序标记(flag),当没有元素交换时跳出循环 
    2、记录有序/无序边界,已有序的元素不需要再被进行比较,因此每轮需比较的数列长度会减少.当后面序列有序,将减少大量比较次数。
    """
    n = len(our_list)    
    lastExchangeIndex = 0   # 记录最后一次交换元素的位置
    sortBorder = n-1        # 记录无序的边界
    
    for i in range(n):
        flag = True
        for j in range(sortBorder):
            # 如果前一个数比后一个数字大,则两个数字交换位置。 即大的往后放。
            if our_list[j]>our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
                flag = False   # 如果有元素交换,将标志位设置为False
                lastExchangeIndex = j
        sortBorder = lastExchangeIndex
        if flag:
            break
                
    return our_list
import random
a_list = [random.randint(1,100) for _ in range(10) ]
print(a_list)
print(bubble_sort_2(a_list))
[64, 80, 82, 80, 5, 61, 72, 74, 94, 86]
[5, 61, 64, 72, 74, 80, 80, 82, 86, 94]

对比

def bubble_sort_show(our_list):
    """
    冒泡排序法
    """
    n = len(our_list)    
    for i in range(n):
        print('---------{}----------'.format(str(i)))
        for j in range(n-i-1):
            # 如果前一个数比后一个数字大,则两个数字交换位置。 即大的往后放。
            if our_list[j]>our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
            print('j={}'.format(str(j)))
            print(our_list)
    return our_list
def bubble_sort_2_show(our_list):
    """
    冒泡排序法 优化版本
    1、添加有序标记(flag),当没有元素交换时跳出循环 
    2、记录有序/无序边界,已有序的元素不需要再被进行比较,因此每轮需比较的数列长度会减少 
    """
    n = len(our_list)    
    lastExchangeIndex = 0   # 记录最后一次交换元素的位置
    sortBorder = n-1        # 记录无序的边界
    
    for i in range(n):
        print('---------{}----------'.format(str(i)))
        flag = True
        for j in range(sortBorder):
            # 如果前一个数比后一个数字大,则两个数字交换位置。 即大的往后放。
            if our_list[j]>our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
                flag = False   # 如果有元素交换,将标志位设置为False
                lastExchangeIndex = j
            print('j={}'.format(str(j)))
            print(our_list)
                
        sortBorder = lastExchangeIndex
        if flag:
            break
                
    return our_list
import random,copy
#a_list = [55, 40, 41, 22, 96]
a_list = [55,40,41,60,63,67,90]

b_list = copy.deepcopy(a_list)
bubble_sort_show(a_list)
---------0----------
j=0
[40, 55, 41, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
j=2
[40, 41, 55, 60, 63, 67, 90]
j=3
[40, 41, 55, 60, 63, 67, 90]
j=4
[40, 41, 55, 60, 63, 67, 90]
j=5
[40, 41, 55, 60, 63, 67, 90]
---------1----------
j=0
[40, 41, 55, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
j=2
[40, 41, 55, 60, 63, 67, 90]
j=3
[40, 41, 55, 60, 63, 67, 90]
j=4
[40, 41, 55, 60, 63, 67, 90]
---------2----------
j=0
[40, 41, 55, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
j=2
[40, 41, 55, 60, 63, 67, 90]
j=3
[40, 41, 55, 60, 63, 67, 90]
---------3----------
j=0
[40, 41, 55, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
j=2
[40, 41, 55, 60, 63, 67, 90]
---------4----------
j=0
[40, 41, 55, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
---------5----------
j=0
[40, 41, 55, 60, 63, 67, 90]
---------6----------





[40, 41, 55, 60, 63, 67, 90]

当待排序的序列后段中有 有序序列,减少排序次数

bubble_sort_2_show(b_list)
---------0----------
j=0
[40, 41, 55, 60, 63, 67, 90]
j=1
[40, 41, 55, 60, 63, 67, 90]
j=2
[40, 41, 55, 60, 63, 67, 90]
j=3
[40, 41, 55, 60, 63, 67, 90]
j=4
[40, 41, 55, 60, 63, 67, 90]
j=5
[40, 41, 55, 60, 63, 67, 90]
[40, 41, 55, 60, 63, 67, 90]


posted @ 2020-06-05 17:23  hhyqhh  阅读(59)  评论(0)    收藏  举报