Python算法学习day8:线性时间排序(希尔排序, 计数排序)

希尔排序

(1) 希尔排序思路

  • 希尔排序是一种分组插入排序算法。
  • 首先取一个整数d1=n/2, 将元素分为d1个组. 每组相邻量元素之间距离为d1, 在各组内进行直接插入排序;
  • 取第二个整数d2=d1/2, 重复上述分组排序过程, 直到di=1. 即所有元素在同一组内进行直接插入排序

(2) 代码实现

def insert_sort_part(li, d): # 分组插入排序实现
	for i in range(d,len(li)):
		tmp = li[i]
		j = i - d
		while j >= 0 and li[j] > tmp:
			li[j+d] = li[j]
			j- = d
		li[j+d] = tmp
		
def shell_sort(li, d):
	d = len(li) // 2
	while d > 0:
		insert_sort_part(li. d)
		d = d // 2
		

计数排序

(1) 计数排序思路

  • 花O(n)的时间扫描一下整个序列 A,获取最小值 min 和最大值 max

  • 开辟一块新的空间创建新的数组 B,长度为 ( max - min + 1)

  • 数组 B 中 index 的元素记录的值是 A 中某元素出现的次数

  • 最后输出目标整数序列,具体的逻辑是遍历数组 B,输出相应元素以及对应的个数

在这里插入图片描述

(2) 代码实现

def count_sort(li, max):
# max表示列表里的最大值
	count = [0 for i in range(max + 1)]
	for value in li:
		count[value] += 1
	li.clear()
	for i, v in range enumerate(count):
		for k in range(v):
			li.append(i)

缺点: 元素的范围不能太大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值