交换排序:冒泡排序
- 冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。
实现方法一
算法思路
范例代码
def method1( data):
"""
/* 对顺序表 data 作交换排序(冒泡排序初级版) */
这段代码严格意义上说,不算是标准的冒泡排序算法,因为它不满足“两两比较
相邻记录”的冒泡排序思想,它更应该是最最简单的交换排序而已。它的思路就是让
每一个关键字,都和它后面的每一个关键字比较,如果大则交换,这样第一位置的关
键字在一次循环后一定变成最小值。
:param data: 待排序的序列
:return:
"""
length = len(data)
for i in range(length - 1):
for j in range(i + 1, length):
if data[i] > data[j]:
# 交换数值
data[j], data[i] = data[i], data[j]
return data
实现方法二
算法思路
范例代码
def method2(self, data):
"""
正宗的冒泡算法
:param data:
:return:
"""
length = len(data)
for i in range(length - 1):
for j in range(length-1, i):
if data[j] > data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
return data
实现方法三
算法思路
i=2 时,我们已经对 9 与 8,8 与 7,……,3 与 2 作了比较,没有任何数据交换,这就说明此序列已经有序,不需要再继续后面的循环判断工作了。为了实现这个想法,我们需要改进一下代码,增加一个标记变量 flag 来实现这一算法的改进。
范例代码
def method3(data):
"""
优化的冒泡算法
:param data:
:return:
"""
flag = True
length = len(data)
for i in range(length - 1):
if flag:
flag = False
for j in range(length - 1, i):
if data[j] > data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
flag = True # 如果有数据交换,则 flag 为 true
return data