上篇文章学习了算法入门——冒泡排序、选择排序,这篇文章我们学习算法入门——插入排序。
插入排序
插入排序是在一组列表中,假设列表只有该列表的第一个元素,再与该列表的第二个元素作对比,当第二个元素比第一个元素小时,则第二个元素插入到第一个元素前面,再与该列表的第三个元素作对比,当第三个元素比第二个元素小,但比第一个元素大时,则第三个元素放在第一个元素后面,第二个元素移动到第三个元素的位置。
插入排序类似我们的打扑克牌,其基本原理如下:
插入排序的代码关键是如何实现插入位置后面的元素进行后移。
示例代码如下:
li = [4, 2, 5, 3, 1]
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i] # 列表第i个元素
j = i - 1 # 列表第i-1个元素
while 0 <= j and tmp < li[j]: # 当前面的元素大于后面的元素时
li[j + 1] = li[j] # 将比tmp大的元素后移一位
j -= 1 # 对更前面的元素作对比
li[j + 1] = tmp # 将tmp元素插入到小的后面
print(li)
insert_sort(li)
运行结果如下:
插入排序的时间复杂度为:O(n²)
快速排序
快速排序是取某个元素(通常是第一个元素)出来后,先从右边开始比较,比该元素小就放在空位上,再从左边开始比较,比该元素大就放在空位上,直到把取出来的元素放在空位上,这时就把取出来的值作为界限分为左右两侧,再把左右两侧按照刚才的操作执行。
示例代码如下:
def partition(li, left, right):
tmp = li[left] # 取第一个元素
while left < right:
while left<right and li[right] >= tmp: # 从右侧的元素大于等于tmp元素
right -= 1 # 对比右侧前一个元素
li[left] = li[right] # 将右边的值写到左边空位上
print(li)
while left<right and li[left] <= tmp: # 从左侧的元素小于等于tmp元素
left += 1 # 对比左侧后一个元素
li[right] = li[left] # 将左边的值写到右边空位上
print(li)
li[left] = tmp # 将取出来的元素放在空位上
return left
li=[5,7,3,6,2,4,8]
partition(li,0,len(li)-1)
print(li)
运行结果如下所示:
可以看到来列表以5为界限分了左右侧,接下来左右侧执行刚才的操作即可完成排序,示例代码如下:
def quick_sort(li,left,right):
if left<right:
mid=partition(li,left,right) # 获取取出来的元素后的存放位置
quick_sort(li,left,mid-1) # 左侧
quick_sort(li,mid+1,right) # 右侧
li=[5,7,3,6,2,4,8]
quick_sort(li,0,len(li)-1)
print(li)
运行结果如下:
快速排序的时间复杂度为:O(nlogn)
好了,算法入门——插入排序、快速排序就学到这里了,下篇文章学习算法入门的其他知识。
公众号:白巧克力LIN
该公众号发布Python、数据库、Linux、Flask、自动化测试、Git、算法等相关文章!