冒泡排序的主要思路是遍历整个数组,将数组中相邻的两个元素进行比较,如果比较中第二个元素比第一个元素小,则将两个元素的位置交换(假设是要排出正序),等第一次遍历完成我们会发现最大的那个元素已经‘冒泡’到数组的最后一个位置,接下来进行第二次遍历,比较范围是 第一个元素到倒数第二个元素(因为倒数第一个元素已经是最大,没有必要加入比较),继续做相邻两个元素的比较,以此类推。
关于算法的稳定性,冒泡排序是稳定的算法,因为在比较两个相邻的大小相同的数据时,它们的相对位置是不会被改变的,所以稳定性也得到保证。
python实现:
def bubble_sort(origin_items, comp=lambda x, y: x > y):
"""冒泡排序"""
items = origin_items[:]
for i in range(len(items) - 1):
for j in range(i, len(items) - 1 - i):
if comp(items[j], items[j + 1]):
items[j], items[j + 1] = items[j + 1], items[j]
return items
冒泡排序还有改进版,可以提高排序效率,思路主要在原有逻辑的基础上,加一层判断,如果在前面的比较有发生过元素位置的交换,则从数组的倒数第二个元素开始往前再做一次相邻元素比较与交换位置,我们在每次遍历操作的结尾多做一次判断:是否在本次遍历中是否发生过元素位置的交换,如果没有,则可以说明数组已经完成排序,可以直接退出遍历,以此类推。这样既可以加快排序,又可以及时退出遍历,节省时间资源。
python实现:
def bubble_sort(origin_items, comp=lambda x, y: x > y):
"""冒泡排序(改进版)"""
items = origin_items[:]
for i in range(len(items) - 1):
swapped = False
for j in range(i, len(items) - 1 - i):
if comp(items[j], items[j + 1]):
items[j], items[j + 1] = items[j + 1], items[j]
swapped = True
if swapped:
swapped = False
for j in range(len(items) - 2 - i, i, -1):
if comp(items[j - 1], items[j]):
items[j], items[j - 1] = items[j - 1], items[j]
swapped = True
if not swapped:
break
return items