插入排序法介绍:
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
插入排序法思想:
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
插入排序思路图:
具体实现
看了前面的介绍,相信你已经对插入排序有了初步的认识,用我们的话来说就是跟扑克牌排序几乎是一个道理。首先,你先需要假设第一个位置作为插入位置。其次你要把第二个位置的数跟第一个数比较,若小于第一个数,则找到了插入位置,进行插入操作。
import time
import random
arr = [0 for i in range(8000)]
for i in range(8000):
arr[i]=random.randint(0,8000)
#arr=[101,34,119,1]
print(arr)
def InsertSort(arr):
insertValue=0
insertIndex=0
for j in range(1,len(arr)):
#No1定义待插入的的数的下标和值
insertValue = arr[j] #变量定义不要循环内部
insertIndex = j-1
#No2寻找插入的位置
while insertIndex>=0 and insertValue < arr[insertIndex]:
#左移insertIndex
arr[insertIndex+1] = arr[insertIndex]#前面的数字后移
insertIndex -= 1#插入下标左移
#No3
if insertIndex + 1 != j:
arr[insertIndex+1] = insertValue
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
InsertSort(arr)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
print(arr)
运行结果
如果数据量到达8000后,排序需要5秒时间。如果你看了我的其他排序博客,你会发现插入排序还算比较有效率。但是其实排序的时间复杂度也是O(n^2),这是最坏的情况,但其平均情况下的关键字比较次数和对象移动次数约为 n 2 /4.所以花费的时间较短。