常见排序算法包括有:冒泡,简单选择,直接插入,快排,归并排序,堆排序,希尔排序
目录
冒泡排序
思想:
冒泡排序应该是最耳熟能详的排序算法,它的基本思想是,比较相邻两个数字,将较大的交换至后面,每一轮比较结束,都会将当前比较序列的最大值甩到最后。
复杂度分析:
如果序列初始状态即为升序,那么只需要一轮比较,即次。最坏的情况下是当初始状态为降序,那么需要比较
次比较,并且还要做同等次数的交换。因此总的时间复杂度为
。
# 冒泡排序,相邻两数比较,每次排序最大值沉到最后
def bubblesort(nums):
n = len(nums)
changed = True
for i in range(n):
# 增加标志位,如果上一次排序没有交换,说明已经排序成功,提前结束
if changed:
changed = False
# 每此排序之后最大值会沉到最后,不参与下一轮比较
for j in range(0, n - 1 - i):
if nums[j] > nums[j + 1]:
changed = True
# 将较大值甩到后面
nums[j], nums[j + 1] = nums[j + 1], nums[j]
return nums
选择排序
思想:
每次从待排序的数组中选择一个最小的,与数组第一个数字交换。
复杂度分析
与冒泡排序相比,选择排序并没有减少比较次数,并且它不像冒泡排序一样,可以判断是否已经排好序提前结束,所以比较次数永远都是次。仅仅是减少了元素移动的次数,最好的时候不需要移动任何元素,最坏的时候也仅需要交换
次。因此总的时间复杂度为
。但是总体上选择排序性能是要略优于冒泡的。
# 选择排序,每次选择最小的与第一位交换
def selectsort(nums):
n = len(nums)
for i in range(n):
minindex = i
for j in range(i + 1, n):
if nums[j] < nums[minindex]:
minindex = j
if minindex != i:
nums[i], nums[minindex] = nums[minindex], nums[i]
return nums
直接插入排序
思想:
假设已有部分排好序的数组,对每一个新数,在这