1.什么是冒泡排序:
冒泡排序(Bubble Sort)是一种交换排序,它重复地走访过要排序的元素,依次比较两个相邻的元素,一层一层的将较大的元素往后移动,其现象和气泡在上升过程中慢慢变大类似,故成为冒泡排序。
2.算法思想
1,从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后,
2,经过第一轮后最大的元素已经排在最后,所以重复上述操作的话第二大的则会排在倒数第二的位置。
3,那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较
假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。
例如:
输入:5,4,1,3,2
输出:1,2,3,4,5
此时无序序列为{5,4,1,3,2}
Python3代码实现:
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 7 17:24:03 2019
@author: ZQQ
"""
def bubbleSort(input_list):
'''
函数说明:冒泡排序(升序)
Parameters:
input_list - 待排序的列表
Returns:
sorted_list - 升序排序后的列表
'''
if len(input_list) == 0:
return [] # 第一层for表示循环的遍数
else: # 外循环,每次使得有序的数增加一个
for i in range(len(input_list) - 1): # 这个循环负责设置冒泡排序的次数,n个数要进行n-1次冒泡
print('第%d趟排序:' % (i + 1))
for j in range(len(input_list) - i - 1): # j为列表下标 # 第二层for表示具体比较哪两个元素
if input_list[j] > input_list[j + 1]:
input_list[j], input_list[j + 1] = input_list[j + 1], input_list[j]
print(input_list)
return input_list
input_list = [5,4,1,3,2]
print('排序前:',input_list)
sorted_list = bubbleSort(input_list)
print('排序后:',sorted_list)
3.算法分析
时间复杂度:
时间复杂度:因为它需要双层循环n*(n-1)),所以平均时间复杂度为O(n^2)
空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1),我们把空间复杂度为O(1)的排序成为原地排序(in-place)
算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
4.优化
当我们在进行技术面的时候,不能只是简单的实现某个算法功能,还要考虑算法的复杂性,对算法进行优化,当然,这部分会比较难,但是这也是算法工程师的必备技能。
对冒泡排序常见的改进方法是加入标志性变量exchange,用于标志某一趟排序过程中是否有数据交换。
如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 8 10:08:42 2019
@author: ZQQ
"""
import random
def bubbleSort_plus(input_list):
'''
函数说明:冒泡排序(升序)
参数:
input_list:待排序的列表
Returns:
sorted_list:升序排序好的列表
'''
if len(input_list) == 0:
return []
else:
for i in range(len(input_list) - 1): # 负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可以把这个n个数排序好)
exchange = False # 用于优化,没有交换时表示已经有序,结束循环
for j in range(len(input_list) - i - 1):
"""
这里这个j呢就是控制每一次具体的冒泡过程,请你想一想,我们第一次冒泡需要冒几次,也就是说需要比较几次,
假如有三个数,那只需要两次就可以了,当下一次时,最后一个
已经是有序的了,所以说少冒泡一次,所以这里j每次都会减去i的值,即不用冒“无用之泡泡”
"""
if input_list[j] > input_list[j + 1]:
# input_list[j] = input_list[j + 1]
# input_list[j + 1] = input_list[j] # 这样会导致数据丢失
input_list[j], input_list[j + 1] = input_list[j + 1], input_list[j]
exchange = True
if not exchange:
break
return input_list
input_list = list(range(10))#产生一个有序列表
random.shuffle(input_list) # 调用shuffle函数打乱顺序
print(input_list)# 排序前
res = bubbleSort_plus(input_list)# 调用冒泡排序算法
print(res)
input_list = [5,4,1,3,2]
print('排序前:',input_list)
sorted_list = bubbleSort_plus(input_list)
print('排序后:',sorted_list)
冒泡排序是一种简单直接暴力的排序算法,为什么说它暴力?因为每一轮比较可能多个元素移动位置,而元素位置的互换是需要消耗资源的,所以这是一种偏慢的排序算法,仅适用于对于含有较少元素的数列进行排序。
降序的话,根据比较值的大小,交换的位置换一下即可。
引用以及参考:
https://cuijiahua.com/blog/2017/12/algorithm_1.html
http://www.cnblogs.com/jingmoxukong/p/4302718.html
https://www.cnblogs.com/SteveWesley/p/10007987.html
代码实现彩色参考:
https://blog.csdn.net/qq_42351033/article/details/86632994