python升序排序数据结构_数据结构-Python实现「插入类排序」

本文介绍了Python中三种插入排序的实现:直接插入排序、折半插入排序和希尔排序。详细讲解了每种排序算法的原理,并提供了相应的代码实现。此外,还探讨了如何生成不同分布的随机测试用例以及算法性能测试的重要性。
摘要由CSDN通过智能技术生成

运行环境:python 2.7.12

学习课程来源:算法与数据结构C++精解

插入类排序

在一个已经有序的序列中,插入一个新的记录。

例子A:好比军训排队,已经排好了一个纵队。这时,有人要临时加入到这个队伍里来,于是教官大声喊道:“新来的,迅速找到你的位置,入队!”。于是,新来的从前向后走去,直到发现身高刚好的位置,就插入这个队伍了。

例子B:玩扑克牌。抽牌是一张张插入到原先有序的牌列中,直到抽牌结束

分类:

1.直接插入排序

2.折半插入排序

3.希尔排序

1. 直接插入排序

def insertion_sort(arr, n):

for i in xrange(n):

# j选取[i,0)的范围,从i开始到1截止。

# 如果arr[j]比arr[j-1]小则互换,依次往复,直到arr[1]与arr[1-1]比较为止。

for j in xrange(i, 0, -1):

if arr[j] < arr[j-1]:

arr[j], arr[j-1] = arr[j-1], arr[j]

else:

break

return arr

改进后的插入排序

def insertion_sort_advance(arr, n):

for i in xrange(1, n):

e = arr[i]

for j in xrange(i, 0, -1):

if arr[j-1] < e:

break

arr[j] = arr[j-1]

else:

j = 0

arr[j] = e

return arr

2.折半插入排序

def binary_insertion_sort(arr, n):

for i in xrange(1, n):

l, r, t = 0, i - 1, arr[i]

while l <= r:

m = (l + r) / 2

if t < arr[m]:

r = m - 1

else:

l = m + 1

for j in xrange(i - 1, l - 1, -1):

arr[j + 1] = arr[j]

arr[l] = t

return arr

3.希尔排序

希尔排序的增量取法:1.增量序列中的值没有除1以外的公因子(例8、4、2、1就不要取);2.增量序列最后一个值是1。

继续修改和添加:

1.为什么要修改。

2.改进前后的性能对比

n=10,100,...10^5级别

补充

生成测试用例

python可以用random模块的shuffle方法,对原来列表进行随机洗牌,但是此随机的程度无法控制。

10位级别的[0,1,3,2,4,5,6,7,8,9]与[9,0,5,2,4,7,1,3,6,8],这2组的随机分布程度是不一样的,且算法甚至要研究百万位级以上的随机分布序列。

from random import shuffle,randint

#生成随机的方法1:(可以控制范围和数量)

arr1 = [randint(-100, 100) for _ in xrange(100)]

#生成随机的方法2:

arr2 = range(100)

shuffle(arr2)

len_arr = len(arr1)

算法性能测试

顺序、逆序、乱序等对于同一种算法的性能,可能会相差一个平方级,即O(n)与O(n^2)。

如何生成可控随机程度的测试用例,和算法的性能测试,具体可参考顶部「学习课程来源」

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值