排序算法专题之插入排序
Posted Python算法之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法专题之插入排序相关的知识,希望对你有一定的参考价值。
插入排序的外层循环变量i指向当前待排序元素,也可以看做待排序区域的左边界,每趟排序的结果就是把a[i]插入到合适位置;内层循环变量j从已排序区域的右端向左扫描,比较和移动元素,直到找到插入位置。
插入排序的特征是虽然已排序区域逐渐增大,但内层循环变量j不一定要扫描整个区域,我们可以使用对分查找快速定位插入位置。
此外,当整个序列“基本有序”时,a[i]距离它的插入位置通常不太远,往往能够较快地完成插入操作,这也是“希尔排序算法”之所以效率较高的原因。
扫码加入“Python算法之旅”微信群,和斌哥面对面交流,更多资料和更有趣的话题等你一起来分享。
排序算法专题之插入排序
1. 经典插入排序
例题1.使用插入排序算法对列表a升序排序。
函数名:insert_sort(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort (a):
for i in range(1, len(a)):
t, j = ①
while j >= 0 and a[j] > t:
a[j+1] = a[j]
j -= 1
②
2. 线性查找插入排序
例题2.使用线性查找插入排序算法对列表a升序排序。
函数名:insert_sort_2 (a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort_2(a):
#嵌套定义函数,线性查找第一个大于key的元素位置
def linear_search(key, left, right):
if a[left] > key:
return ①
else:
while a[right] > t:
right -= 1
return ②
for i in range(1, len(a)):
t = a[i]
j = linear_search(t, 0, i-1)
for k in range(i-1, j-1, -1):#j指向插入位置
a[k+1] = a[k]
a[j] = t
3. 对分查找插入排序
例题3.使用对分查找插入排序算法对列表a升序排序。
函数名:insert_sort_3 (a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort_3(a):
#嵌套定义函数,对分查找第一个大于key的元素位置
def binary_search(key, left, right):
while left <= right:
m = (left + right) // 2
if a[m] > key:
right = m - 1
else:
left = m + 1
return ①
for i in range(1, len(a)):
t = a[i]
j = binary_search(t, 0, i-1)
for k in range(i-1, j-1, -1):#j指向插入位置
a[k+1] = a[k]
a[j] = t
1. 经典插入排序
例题1.使用插入排序算法对列表a升序排序。
函数名:insert_sort(a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort (a):
for i in range(1, len(a)):
t, j = a[i], i - 1
while j >= 0 and a[j] > t:
a[j+1] = a[j]
j -= 1
a[j+1] = t
2. 线性查找插入排序
例题2.使用线性查找插入排序算法对列表a升序排序。
函数名:insert_sort_2 (a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort_2(a):
#嵌套定义函数,线性查找第一个大于key的元素位置
def linear_search(key, left, right):
if a[left] > key:
return left
else:
while a[right] > t:
right -= 1
return right + 1
for i in range(1, len(a)):
t = a[i]
j = linear_search(t, 0, i-1)
for k in range(i-1, j-1, -1):#j指向插入位置
a[k+1] = a[k]
a[j] = t
3. 对分查找插入排序
例题3.使用对分查找插入排序算法对列表a升序排序。
函数名:insert_sort_3 (a)
参数表:a -- 待排序列表。
返回值:该方法没有返回值,但是会对列表的对象进行升序排序。
算法思想:外层循环控制待排序数组的左边界,即a[i:]为待排序部分;内层循环扫描a[:i],将元素a[i]插入到适当位置
def insert_sort_3(a):
#嵌套定义函数,对分查找第一个大于key的元素位置
def binary_search(key, left, right):
while left <= right:
m = (left + right) // 2
if a[m] > key:
right = m - 1
else:
left = m + 1
return left
for i in range(1, len(a)):
t = a[i]
j = binary_search(t, 0, i-1)
for k in range(i-1, j-1, -1):#j指向插入位置
a[k+1] = a[k]
a[j] = t
Python排序算法系列文章是我在阅读了大量算法专著以后,尝试用浅陋的语言把自己的理解表达出来。由于本人水平有限,表述中难免出现疏漏甚至错误之处,敬请谅解。
无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!
需要本文word版的,可以加入“选考VB算法解析”知识星球参与讨论和下载文件,“选考VB算法解析”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注选考VB算法,感兴趣就一起来!
相关优秀文章:
以上是关于排序算法专题之插入排序的主要内容,如果未能解决你的问题,请参考以下文章