1、写在前面的话
本篇博客并不涉及到排序算法的理论讲解,具体理论可以参考reference的链接,并且强烈推荐数据结构和算法的可视化网站【0】。本文给出八种经典的排序算法的Python实现代码和部分注解,算是一个总结,也感谢网络众多优秀的博主分享他们的idea,站在巨人的肩膀上果然成长很迅速。排序可以说在经典算法中是很重要的一部分,对于常见的排序算法要做到本能的敲出代码,了解各种算法的时间复杂度和空间复杂度,关于时间复杂度和空间复杂度具体可以参考【1】。对于外部排序和线性时间的排序也请参考reference的链接。对于稳定性的判断,请记住口诀,不稳定:快选堆希 稳定:插冒归基。
2、Show me the code
冒泡排序:
def bubble(nums):
if not isinstance(nums, list) or not nums:
return -1
#i控制几趟
for i in range(1, len(nums)):
# len(nums)-i因为最后有排好的数字
for j in range(0, len(nums)-i):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
选择排序:
def select(nums):
if not isinstance(nums, list) or not nums:
return -1
for i in range(len(nums)-1):
min_index = i
# i+1 是开始从i之后的元素找到最小值,并用minindex标记上
for j in range (i+1, len(nums)):
if nums[j] < nums[min_index]:
min_index = j
#如果和最开始的标记的最小元素不等,就交换两个元素
if min_index != i:
nums[i], nums[min_index] = nums[min_index], nums[i]
return nums
插入排序:
def insertionSort(nums):
if not isinstance(nums, list) or not nums:
return -1
#i是控制处理的第几个元素
for i in range(1,len(nums)):
for j in range(i, 0, -1):
# 如果比前面的元素小,则往前移动
if nums[j] < nums[j-1]:
nums[j], nums[j-1] = nums[j-1], nums[j]
# 否则代表比前面的所有元素都小,不需要再移动