写在前面,排序算法属于面试中绝对不会错过的一道题,不管是原理,手撕,变形,优化,全都是考点。
接下来更的几篇文章争取全面考虑,从面试官的角度解析排序算法以及对应回答~如果喜欢的话可以点赞收藏关注!及时收获知识~
总结
先来总结一下即将展开的八大排序算法。
排序算法可以依据以下几个标准划分成不同的类别(来自维基百科排序算法):计算的时间复杂度(最差、平均、和最好性能)
空间复杂度(所需额外辅助存储空间)
稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前
依据排序的方法:插入、交换、选择、合并等等。
一图概览排序算法
冒泡排序(Bubble Sort)
从最简单的开始讲起。冒泡排序属于非常好理解的排序算法了。这是我上学的时候接触的第一个排序算法,记忆犹新~
算法思想
思想很简单,从左到右,比较两个相邻的元素。如果这两个数字顺序不是升序,就交换这两个数字,小的在前大的在后。直到最后没有数字需要交换。
由于数字越大,越往下沉,沉到数组的最后位置。数字越小,越上浮,浮到数组最前位置,所以叫做冒泡排序~
动图非常直观~ (图片来自网络)冒泡排序属于交换类
算法步骤
从左到右:比较两个相邻元素,看是否为升序,即第一个元素小于第二个元素。如果不是升序,交换这两个元素在数组中的位置。
每一对相邻元素,都要做一次这样的比较。假设数组长度为n,需要比较n-1次。这样比较一轮,最大的数字会沉到数组最右侧。下一次则不需要比较最后的数字。
重复,没有元素需要交换为止。
代码实现
import random
def gen_random_data(start, end, number):
# 用于生成数据的方法,数字大小在start到end之间,共number个数字
res = []
for i in range(number):
res.append(random.randint(start,end))
return res
def Bubble_Sort(array):
for i in range(1, len(array)):
for j in range(len(array) - i):
if array[j] > array[j + 1] :
tmp = array[j]
array[j] = array[j + 1]
array[j+1] = tmp
真的太困了。。改进思路与总结明天写~如果对这个系列内容感兴趣,可以收藏关注点赞~明天继续更!真的不鸽了!困到恍惚
-----------------20200513更新-----------------
改进思路
假设有数组[2,3,4,5,7,6],冒泡排序,需要进行5趟排序。但是第一趟排序进行后,数组变为[2,3,4,5,6,7],已经有序,不需要再进行排序了。但是按照上面的经典排序,仍然需要进行4趟排序。
改进方法可以考虑设置一个标志位,当某趟排序没有产生数据交换,就代表数组已经有序,这样就可以结束排序。
def Bubble_Sort_Opt(array):
flag = True
for i in range(1, len(array)):
if flag:
flag = False
for j in range(len(array) - i):
if array[j] > array[j + 1] :
tmp = array[j]
array[j] = array[j + 1]
array[j+1] = tmp
# print(array)
flag = True
总结
冒泡排序属于最经典的排序算法,由于其直观性,很容易被应试者作为第一个解决办法想到。
由于每次交换,只需要临时存储一个数字,所以空间复杂度为O(1)。
最好情况是数据是已经有序的,这样遍历一次就可以结束,最好时间复杂度为O(n)。
最坏情况是数据是逆序,这样每次遍历都需要交换一次,最坏时间复杂度为
。
由于出现两个相同数字不会导致交换,所以相同数字相对位置不变,冒泡排序是稳定的排序算法。