扑克牌排序_程序员面试常问算法:插入类排序法

本文探讨了插入类排序法,包括直接插入排序、折半插入排序、表插入排序和希尔排序。通过扑克牌排序的例子进行阐述,特别介绍了表插入排序和希尔排序的原理,并提供了Python3的实现代码。
摘要由CSDN通过智能技术生成

一、算法题目

1009ae22b6caf1997ce915ec8b6638ef.png

插入类排序法:

说白了,就是通过插入方式的排序方法,包括如下直接插入排序、折半插入排序、表插入排序、希尔排序。

直接插入排序:

36c6ccdfaf839033e01086da6df5320b.png

类似我们生活中的打扑克启牌的方式。

基本思想是:每抓一张牌,插入到合适的位置(在手中的牌需要重头开始比较,直到找到它合适的位置),直到抓完牌为止,从而得到一个连续的有序序列。由于直接插入排序简单且容易理解,下文中不再过多讨论。

折半插入排序:

如果知道二分法查找,这个也很好理解。

基本思想是:每抓一张牌,插入到手中牌的位置时,查找手中牌的方式不一样。先与手中牌的二分之一处的比较大小,确定哪一半可以插入,然后再取这一半作为一个整体,重复上述过程,直到找到合适位置。由于折半插入排序容易理解,也不过多讨论。

表插入排序:

可以简单理解为,扑克牌抓到手里什么样就是什么样,没有进行任何整理。但在扑克牌上做了个小标记(指针值),来区分扑克牌的大小顺序。

基本思想是:它是修改元素对应指针的值来代替元素的移动。

c1b8f9f0ffea76572431309d32dbf1d7.png

希尔排序:

就像我们抓扑克牌时,第1张和第5张比较,第2和第6比较,第3和第7比较等等,然后再缩小比较的跨度。直到比较的跨度为1。

基本思想是:先将整个待排序的序列分割成为若干子序列分别进行直接插入排序,等整个序列“基本有序”后,再对全部记录依次进行直接插入排序

二、算法推演

1、表插入排序。

请参考下表(比较一个值,移动数组对应的索引,相当于移动指针值)

2242b2011013d7ebca220450c58677c9.png

2、希尔排序

它是一种缩小增量排序,参考下表

5bcb1de6270373f09ded40ea3529d1cd.png

三、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头条知识节#

f8a12bd61ca50294927cd161856798c0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值