直接插入排序就是先从头到后面遍历一遍,然后对于每一个都遍历这个元素之前的元素使其插入到合适的位置,由于是从头往前遍历所以该元素之前的元素本身已经是排序好的元素了,我们需要做的事情只是将该元素插入合适的位置。
def insertSort(input_list):
if len(input_list)==0:
return []
sorted_list=input_list
for i in range(1,len(sorted_list)):
temp=sorted_list[i]
j=i-1
while j>=0 and temp<sorted_list[j]:
sorted_list[j+1]=sorted_list[j]
j-=1
sorted_list[j+1]=temp
return sorted_list
if __name__=='__main__':
input_list=[6,4,8,9,2,3,1]
print('排序前',input_list)
sorted_list=insertSort(input_list)
print('排序前',sorted_list)
查找插入位置的时候可以也使用二分查找,运行结果没有改变,只是在查找插入位置的次数减少了,提高了算法的效率。
def BinarySearch(input_list,end ,value):
left=0
right=end-1
while left<right:
middle=left+(right-left)//2
if input_list[middle]>value:
right=middle
else:
left=middle+1
return left if input_list[left]>=value else -1
def insertSort(input_list):
if len(input_list)==0:
return []
sorted_list=input_list
for i in range(1,len(sorted_list)):
temp=sorted_list[i]
j=i-1
index=BinarySearch(input_list,i,sorted_list[i])
if index !=-1:
while j>=index:
sorted_list[j+1]=sorted_list[j]
j-=1
sorted_list[j+1]=temp
return sorted_list
if __name__=='__main__':
input_list=[6,4,8,9,2,3,1]
print('排序前',input_list)
sorted_list=insertSort(input_list)
print('排序前',sorted_list)
def BinarySearch(input_list, end, value):
left = 0
right = end - 1
while left <= right:
middle = left + (right - left) // 2
if input_list[middle] > value:
right = middle - 1
else:
left = middle + 1
return left if left < end else -1
def BinaryInsertSort(input_list):
if len(input_list) == 0:
return []
result = input_list
for i in range(1, len(input_list)):
j = i - 1
temp = result[i]
insert_index = BinarySearch(result, i, result[i])
if insert_index != -1:
while j >= insert_index:
result[j + 1] = result[j]
j -= 1
result[j + 1] = temp
return result
if __name__ == '__main__':
input_list = [6, 4, 8, 9, 2, 3, 1]
print('排序前:', input_list)
sorted_list = BinaryInsertSort(input_list)
print('排序后:', sorted_list)