在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白:
希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身。而归并排序是利用增加新的空间,来换取时间复杂度的减少。这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同。
归并排序涉及到递归的使用,需要理解其中精髓才能更好了解归并排序,以及其他应用到递归的算法。理解其本质才能更好的应用。
希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
时间复杂度
- 最优时间复杂度:根据步长序列的不同而不同
- 最坏时间复杂度:O(n2)
- 稳定想:不稳定
"""
希尔排序
最优时间复杂度: 根据步长序列不同而不同
最坏时间复杂度: O(n*n)
稳定性 : 不稳定
""" import time
import random def shell_sort(list):
n = len(list)
#初始步长
gap = n // 2
while gap > 0:
# 按初始步长进行插入排序
for j in range(gap, n):
i = j
# 插入排序
while i >= gap and list[i-gap] > list[i]:
list[i-gap], list[i] = list[i], list[i-gap]
i -= gap # 得到新的步长
gap = gap // 2 def new_num(lis):
"""随机生成50个数加入列表中"""
for i in range(50):
j = random.randint(0, 10000)
lis.append(j) if __name__ == '__main__':
first_time = time.time()
# 空列表
lis = [54,26,93,17,77,31] # 随机函数添加到列表中
# new_num(lis)
print(lis) # 列表排序
shell_sort(lis)
print(lis) # 结束时间
last_time = time.time() print("共用时%s" % (last_time - first_time))
归并排序
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(nlogn)
- 稳定性:稳定
"""
归并排序
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
稳定性:稳定 与其他排序区别
利用一个新列表讲算法排序后的元素储存当中
空间换时间
""" import time
import random def merge_sort(list):
"""归并排序"""
n = len(list)
if n <= 1:
return list
# 最大整除
mid = n // 2
# left 利用递归 截取的列表形成的有序列表
left_list = merge_sort(list[:mid])
# right 利用递归 截取的列表形成的有序列表
right_list =merge_sort(list[mid:])
# 创建 左右游标记录列表值的索引
left_pointer, right_pointer = 0,0
# 创建新空列表
result = []
# 循环 比较数值大小
# 退出循环条件 当左右游标其中一个等于所在列表的长度时
while left_pointer < len(left_list) and right_pointer < len(right_list):
# 判断 左值和右值大小
if left_list[left_pointer] <= right_list[right_pointer]:
result.append(left_list[left_pointer])
# 每判断一次 游标加一
left_pointer += 1
else:
result.append(right_list[right_pointer])
right_pointer += 1
# 将最后一个数值加入新列表中
result += left_list[left_pointer:]
result += right_list[right_pointer:]
# 返回值
return result def new_num(lis):
"""随机生成50个数加入列表中"""
for i in range(50):
j = random.randint(0, 100)
lis.append(j) if __name__ == '__main__':
first_time = time.time()
# 空列表
lis = [] # 随机函数添加到列表中
new_num(lis)
print(lis) # 列表排序
# 因为归并排序最后是返回一个新列表,所以打印输出为新列表
alist = merge_sort(lis)
print(alist) # 结束时间
last_time = time.time() print("共用时%s" % (last_time - first_time))
在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序的更多相关文章
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- Python数据结构与算法_删除排序数组中的重复项(06)
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成. ...
- 【数据结构与算法】希尔排序 python和c++实现
算法思路 每一次:固定间隔把数据分组,每一组进行排序 每次比上次选取更小的间隔分组,再每组排序,直到间隔为1 代码 c++:(越看越不明白了,后看) int gap = length;//length ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- Python数据结构与算法设计总结篇
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...
- Python数据结构与算法设计(总结篇)
的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Pytho ...
随机推荐
- rpm安装21c单实例数据库
linux 7.6 使用rpm安装21c单实例数据库 一.基础环境配置 1.1 关闭防火墙 systemctl stop firewalld systemctl disable firewalld s ...
- Flutter 学习笔记(01)__从 0 开始创建一个 flutter 项目
最近发现有不少的公司已经跳出 uniapp 的坑坑,开始使用 flutter 开发app了,为了让自己不失业,赶紧卷起来!此篇文章教你从 0 基础开发一个 简单页面,文章篇幅较长,建议收藏!也可以直接 ...
- 《SQL与数据库基础》07. 约束
目录 约束 常见约束案例 外键约束 删除/更新行为 本文以 MySQL 为例 约束 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据. 目的:保证数据库中数据的正确性.有效性和完整性. 分 ...
- 代码随想录算法训练营第二十五天| 216.组合总和III 17.电话号码的字母组合
216.组合总和III 卡哥建议:如果把 组合问题理解了,本题就容易一些了. 题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%8 ...
- QA|20221002|SecureCRT中退格键变成了^H
原因:backspace键和delete键的键码映射问题 解决办法一:要使用回删键(backspace)时,同时按住ctrl键 解决办法二:重新设置码值映射关系.比如SecureCRT中,会话 ...
- win11安装ubuntu(by wsl2)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本机情况 省吃俭用入手了ThinkPad T14,打算 ...
- 「codeforces - 1486F」Pairs of Paths
link. 还算萌,但是代码有些难写-- 你首先会想要 int n, m, fa[20][300100], pa[300100], dep[300100], cnt[900100]; int ldf[ ...
- 「codeforces - 868F」Yet Another Minimization Problem
link. 值域分治优化决策单调性 DP 的 trick.朴素做法 trivial,不赘述. 考虑求取一个区间 \([l,r]\) 的 DP 值.先搞定在 \(m=\lfloor\frac{l+r}{ ...
- Solution -「洛谷 P4689」「YunoOI 2016」这是我自己的发明
Description Link. 给一个树,\(n\) 个点,有点权,初始根是 1. \(m\) 个操作,种类如下: 1 x 将树根换为 \(x\). 2 x y 给出两个点 \(x,y\),从 \ ...
- oracle优化-分页查询新认识
在写这篇文章之前,对分页查询的认识就是经典的三层嵌套:第①层:获得需要的数据,第②层:用rownum限制展示数据的上限,第③层:用rownum的别名rn限制展示数据的下限. 在生产中遇见一个两层嵌套满 ...