常见算法之‘插入类排序’
插入类排序:
每步将一个待排序的记录,按其排序码大小,插到前面已经排序的文件中的适当位置,直到全部插完为止。
1.直接插入排序
1.算法思想:从待排序的第n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。
2.代码:
def insert_sort(array): n=len(array) for i in range(1,n): if array[i]<array[i-1]: temp=array[i] index=i #待插入的下标 for j in range (i-1,-1,-1): #从i-1循环到0 if array[j]>temp: array[j+1]=array[j] index[j] #记录待插入下标 else: break array[index]=temp return array
2.shell排序(希尔排序):
1.原理:是对相邻指定距离(称为增量)的元素进行比较,并不断把增量缩小至1,完成排序。
shell排序时,开始时增量比较大,分组较多,每组的记录数目较少,用此,在各组内采用直接插入排序较快,后来增量di逐渐缩小,分组数减少,各组的记录数增多,
但由于按(di-1)分组排序,文件较接近于有序状态,所以新的一趟排序过程较快,因此shell排序在效率上比直接插入排序有较大的改进。
2.代码:
def shellsort(nums): step=len(nums)//2 #设定步长 while step>0: for i in range(step,len(nums)): while i>=step and nums[i-step]>nums[i]: #类似插入排序,当前值与指定步长之间的值比较 符合条件则交换位置 nums[i],nums[i-step]=muns[i-step],mums[i] i-=step return nums