一、算法题目
插入类排序法:
说白了,就是通过插入方式的排序方法,包括如下直接插入排序、折半插入排序、表插入排序、希尔排序。
直接插入排序:
类似我们生活中的打扑克启牌的方式。
基本思想是:每抓一张牌,插入到合适的位置(在手中的牌需要重头开始比较,直到找到它合适的位置),直到抓完牌为止,从而得到一个连续的有序序列。由于直接插入排序简单且容易理解,下文中不再过多讨论。
折半插入排序:
如果知道二分法查找,这个也很好理解。
基本思想是:每抓一张牌,插入到手中牌的位置时,查找手中牌的方式不一样。先与手中牌的二分之一处的比较大小,确定哪一半可以插入,然后再取这一半作为一个整体,重复上述过程,直到找到合适位置。由于折半插入排序容易理解,也不过多讨论。
表插入排序:
可以简单理解为,扑克牌抓到手里什么样就是什么样,没有进行任何整理。但在扑克牌上做了个小标记(指针值),来区分扑克牌的大小顺序。
基本思想是:它是修改元素对应指针的值来代替元素的移动。
希尔排序:
就像我们抓扑克牌时,第1张和第5张比较,第2和第6比较,第3和第7比较等等,然后再缩小比较的跨度。直到比较的跨度为1。
基本思想是:先将整个待排序的序列分割成为若干子序列分别进行直接插入排序,等整个序列“基本有序”后,再对全部记录依次进行直接插入排序。
二、算法推演
1、表插入排序。
请参考下表(比较一个值,移动数组对应的索引,相当于移动指针值)
2、希尔排序
它是一种缩小增量排序,参考下表
三、Python3的代码实现
1、表插入排序
def insertsort(testlist): n = len(testlist) for i in range(1, n): index = i - 1 keyvalue = testlist[i] print("第"+str(i)+"次排序,比较",testlist[index] ,">", keyvalue," 若小于则跳过") while index >= 0 and testlist[index] > keyvalue: print("------第"+str(i)+"次排序,取关键字",keyvalue,"当",testlist[index] , ">", keyvalue,""+str(testlist[index])+"后移") testlist[index + 1] = testlist[index] index -= 1 testlist[index + 1] = keyvalue print("第"+str(i)+"次排序结果,取关键字",keyvalue,":",testlist)testlist = [43, 29, 37, 10, 80]print("排序前:", testlist)insertsort(testlist)print("排序后:", testlist)
2、希尔排序
def shellsort(sortlist): step = int(len(sortlist)/2) print("初定步长:",step) while step > 0: for i in range(step, len(sortlist)): print("-----比较大小:若",sortlist[i-step],">",sortlist[i]) while i >= step and sortlist[i-step] > sortlist[i]: print("---------比较:则",sortlist[i-step],">",sortlist[i],"互换") sortlist[i], sortlist[i-step] = sortlist[i-step], sortlist[i] i -= step print("设定步长为",step,"的比较结果:",sortlist) step = int(step/2) return sortlistsortlist = [12,16,19,20,25,27,9,10]print("排序前:",sortlist)print("排序后:",shellsort(sortlist))
代码亲测可行,欢迎批评指正!
#科技青年# #423头条知识节#