冒泡排序法 及其优化
冒泡排序法 及其优化
冒泡排序法:
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]

浙公网安备 33010602011771号