-
冒泡排序(Bubble Sort)是一种简单直观的排序算法。
它重复比较两个相连的元素,按照大小顺序两个数字交换过来。 越小的元素会经由交换慢慢"浮"到数列的顶端。
- 例一:
lit = [4, 6, 5, 7, 2]
求最大值?
从图上可以看到,两两比较
4 > 6 ? 6大所以图2数字没有交换,
接续比较
6 >5? 6大于5,所以交换数字
…
可以看到总共比较了4次也就是 len(lit) - 1 次
lit = [4, 6, 5, 7, 2]
for j in range(len(lit) - 1):
if lit[j] > lit[j+1]:
lit[j], lit[j+1] = lit[j+1], lit[j]
print(lit)
[4, 5, 6, 2, 7]
例二:
冒泡算法
对lit 列表进行升序排序;
可以多次循坏比较,循坏多少次?
lit 列表有len(lit)个元素,每个数都需要单独拿出来比一次,但是最后一次最后一个数肯定是最小的不需要再进行比较了,所以总次数是 len(lit) - 1
lit = [4, 6, 5, 7, 2]
count = 0
swap_count = 0
for i in range(len(lit) - 1):
for j in range(len(lit) - 1):
count += 1
if lit[j] > lit[j+1]:
lit[j], lit[j+1] = lit[j+1], lit[j]
swap_count += 1
print(lit)
print(count,swap_count)
print(lit)
count 记录比较了多少次?
swap_count 记录数字交换了多少次?
通过结果思考到每次循坏比较没有必要再遍历比较后面已经确认的最大数了,所以每次比较的范围应该是递减的 range(len(lit) - 1 - i )
[4, 5, 6, 7, 2]
[4, 5, 6, 2, 7]
[4, 5, 2, 6, 7]
[4, 2, 5, 6, 7]
[2, 4, 5, 6, 7]
16 5
[2, 4, 5, 6, 7]
lit = [4, 6, 5, 7, 2]
count = 0
swap_count = 0
for i in range(len(lit) - 1):
for j in range(len(lit) - 1 -i ):
count += 1
if lit[j] > lit[j+1]:
lit[j], lit[j+1] = lit[j+1], lit[j]
swap_count += 1
print(lit)
print(count,swap_count)
print(lit)
比较的次数降低了6次,提高效率
[4, 5, 6, 7, 2]
[4, 5, 6, 2, 7]
[4, 5, 2, 6, 7]
[4, 2, 5, 6, 7]
[2, 4, 5, 6, 7]
10 5
[2, 4, 5, 6, 7]
例三:
特殊的数列
像 a = [10, 1, 2, 3, 4, 5] 只要循坏比较一次就能等到结果
可以加一个开关,控制终止程序
a = [10, 1, 2, 3, 4, 5]
out_count = 0
in_count = 0
swap_count = 0
for i in range(len(a) - 1):
out_count += 1
flag = False
for j in range(len(a) - 1 -i ):
in_count += 1
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swap_count += 1
print(a)
flag = True
if not flag:
break
print(out_count, in_count, swap_count)
print(a)
[1, 10, 2, 3, 4, 5]
[1, 2, 10, 3, 4, 5]
[1, 2, 3, 10, 4, 5]
[1, 2, 3, 4, 10, 5]
[1, 2, 3, 4, 5, 10]
2 9 5
[1, 2, 3, 4, 5, 10]
out_count 外部循坏计数为 2此时程序已经执行结束.