插入排序类似于打扑克,每抽到一张新牌都要跟已有的牌进行比较,插入到合适的位置中。
三、插入排序
原理
插入排序首先将数列分成两个部分,数列的第一个数为left部分,其余数为right部分。然后将right部分的数依次取出,插入到left部分中的合适位置上。当right部分为空时,数列就变成了有序数列,插入排序结束。
举例
以数列[7,3,5,1,9,4]为例,进行插入排序。
第一轮排序
将数列分成左右两部分,left部分是第一个数字,right部分是其他数字,取出第一个数7。
left:
right:
第二轮排序
从right部分中取出第一个数3,插入到left部分中的合适位置,3比7小,放在7的右边。
?left:
right:
第三轮排序
从right部分取出当前的首位5,插入到left部分的合适位置中,5比3大比7小,5插入到3、7中间。
left:
right:
第四轮排序
从right部分取出当前首位1,插入到left部分中合适位置,1比3、5、7都小,放left首位。
left:
right:
第五轮排序
从right部分取出当前首位9,插入到left中,9比1、3、5、7都打,放末尾。
left:
right:
第六轮排序
从left部分取出首位4,插入到left中,4比1、3大比5、7、9小,放在3后面,5前面。
left:
right:
第六轮排序后,right数列为空,排序结束。
插入排序的时间复杂度为
算法伪代码
target = iList[right]
for left in range(0, right):
if target <= iList[left]:
iList[left+1:right+1]=iList[left:right]
iList[left] = target
完整源码
InsertionSort.py
from randomList import randomList
import timeit
iList = randomList(20)
def selectionSort(iList):
if len(iList) <= 1:
return iList
for i in range(0, len(iList)-1):
if iList[i] != min(iList[i:]): #使用min函数找到剩余数列中最小的那个数
minIndex = iList.index(min(iList[i:])) #minIndex是最小数的序号(下标)
iList[i], iList[minIndex] = iList[minIndex], iList[i]
# print("第 %d 轮排序结果:" %(i+1), end="")
# print(iList)
return iList
if __name__ == "__main__":
print(iList)
print(selectionSort(iList))
print(timeit.timeit("selectionSort(iList)", "from __main__ import selectionSort,iList", number=100))
明天写归并排序和快速排序,一起学习,一起进步~
?
|