python 实现 插入排序
插入排序原理:
通过构建有序序列,对于未排序数据,
在已排序序列中从后向前扫描,找到相应位置并插入*
例如对列表 L = [2, 22, 12, 56, 78, 60] 进行排序
开始排序时,我们先把列表的第一个元素 2 设为有序序列SortedList,剩下的元素设置为未排序数据UnsortedList,
第一轮:我们从UnsortedList中取出第一个元素 22,将它与SortedList中的元素 2 进行比较;由于22 大于 2,故不变,
此时SortedList 变为了 [2, 22],UnsortedList 变为 [12, 56, 78, 60]
对于 L 来说就是:
[2, 22, 12, 56, 78, 60]
第二轮:我们从UnsortedList中取出第一个元素 12,将它与SortedList中的元素 22 进行比较;由于22 大于 12,故两者交换;然后12再跟 2 比较,由于12 大于 2 ,故不变,此时SortedList 变为了 [2, 12, 22],UnsortedList 变为 [56, 78, 60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第三轮:我们从UnsortedList中取出第一个元素 56,将它与SortedList中的元素 22 进行比较;由于56大于 22,故不变;然后56再跟 12 比较,由于56 大于 12 ,故不变,又由于56 大于 2 ,故不变,此时SortedList 变为了 [2, 12, 22, 56],UnsortedList 变为 [78, 60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第四轮:我们从UnsortedList中取出第一个元素 78,将它与SortedList中的元素 56 进行比较;由于78大于 56,故不变;依次同理跟SortedList 中的元素比较,78小于SortedList的元素 就交换,反之不变;此时SortedList 变为了 [2, 12, 22, 56,78],UnsortedList 变为 [60]
对于 L 来说就是:
[2, 12, 22, 56, 78, 60]
第五轮:我们从UnsortedList中取出第一个元素 60,将它与SortedList中的元素 78 进行比较;由于78大于 60,故交换;依次同理跟SortedList 中的元素比较,60小于SortedList的元素 就交换,反之不变;此时SortedList 变为了 [2, 12, 22, 56,78, 60],UnsortedList就没有元素,此时排序也结束了。
对于 L 来说就是:
[2, 12, 22, 56, 60, 78]
一共进行 len(L) - 1 轮比较。
第一轮: [2, 22, 12, 56, 78, 60]
第二轮: [2, 12, 22, 56, 78, 60]
第三轮: [2, 12, 22, 56, 78, 60]
第四轮: [2, 12, 22, 56, 78, 60]
第五轮: [2, 12, 22, 56, 60, 78]
代码实现如下:
class InsertSort():
def __init__(self, lyst):
self.list = lyst
def Sorted(self):
for i in range(1, len(self.list)):
preIndex = i - 1
current = self.list[i]
while preIndex >= 0 and self.list[preIndex] > current:
self.list[preIndex+1] = self.list[preIndex]
preIndex -= 1
self.list[preIndex+1] = current
return self.list
if __name__ == "__main__":
print('---------- Test ------------')
l = [212, 358, 6, 5, 2, 65, 12, 1, 48, 37]
print(f'原数组为{l}')
Is = InsertSort(l)
l_new = Is.Sorted()
print(f'经过插入排序后的数组为:\n{l_new}')
插入算法,最坏情况下的时间复杂度为O(n²)
空间复杂度为:O(1)