直接插入排序,对于少量元素的排序,这是一个很有效的算法
基本思想:将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录增1的有序表
实现过程:使用的是双层循环,外层循环对除了第一个元素之外的所有元素进行遍历, 内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
举个例子,对数组 arr = [2, 3, 67, 5, 56, 25, 56, 65] 进行直接插入排序:
具体的过程为:
上图中,第一行为待排序的数组,分割线后的表格中,每一行都代表一次排序后的结果,其中绿色代表有序的序列,橘色代表待排序的序列
从上图中,我们可以得出,直接插入排序是具有稳定性的
好了,废话不多说,直接上代码:
注:这个版本的代码,是写代码写嗨了,写成面向对象版本的了,如果想看简化版,最下面有
class InsertionSort(object):
def __init__(self,arr):
"""初始化"""
self.arr = arr
def sort(self):
"""对数组进行直接插入排序"""
# 遍历除第一个元素之外的所有元素【因为第一个元素是有序的】
for i in range(1,len(self.arr)):
# 从第n-1个位置向前遍历,若是小于前面的数,就向前移动
for j in range(i)[::-1]:
if self.arr[j+1] < self.arr[j]:
self.arr[j+1],self.arr[j] = self.arr[j],self.arr[j+1]
def show(self):
"""对数组进行遍历"""
for i in self.arr:
print(i,end=" ")
print()
def main():
arr = [2, 3, 67, 5, 56, 25, 56, 65]
insert = InsertionSort(arr)
insert.sort()
insert.show()
if __name__ == '__main__':
main()
运行结果为:
从上述代码中,可以看出,直接插入排序算法的性能为:
下面是简化版代码:
arr = [2, 3, 67, 5, 56, 25, 56, 65]
# 遍历除第一个元素之外的所有元素【因为第一个元素是有序的】
for i in range(1,len(arr)):
# 从第n-1个位置向前遍历,若是小于前面的数,就向前移动
for j in range(i)[::-1]:
if arr[j+1] < arr[j]:
arr[j+1],arr[j] = arr[j],arr[j+1]