独白

  希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身。而归并排序是利用增加新的空间,来换取时间复杂度的减少。这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同。

  归并排序涉及到递归的使用,需要理解其中精髓才能更好了解归并排序,以及其他应用到递归的算法。理解其本质才能更好的应用。


希尔排序

希尔排序(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) --希尔排序、归并排序的更多相关文章

  1. Java数据结构和算法(五)--希尔排序和快速排序

    在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...

  2. Python数据结构与算法_删除排序数组中的重复项(06)

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成. ...

  3. 【数据结构与算法】希尔排序 python和c++实现

    算法思路 每一次:固定间隔把数据分组,每一组进行排序 每次比上次选取更小的间隔分组,再每组排序,直到间隔为1 代码 c++:(越看越不明白了,后看) int gap = length;//length ...

  4. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  5. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  6. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  7. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  8. Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...

  9. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  10. Python数据结构与算法设计(总结篇)

    的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Pytho ...

随机推荐

  1. OpenApi(Swagger)快速转换成 TypeScript 代码 - STC

    在现代的 Web 开发中,使用 OpenAPI(以前称为 Swagger)规范来描述和定义 API 已经成为一种常见的做法.OpenAPI 规范提供了一种统一的方式来描述API的结构.请求和响应,使得 ...

  2. Wow: 基于 DDD、EventSourcing 的现代响应式 CQRS 架构微服务开发框架

    领域驱动 | 事件驱动 | 测试驱动 | 声明式设计 | 响应式编程 | 命令查询职责分离 | 事件溯源 架构图 事件源 可观测性 OpenAPI (Spring WebFlux 集成) 自动注册 命 ...

  3. [selenium]点击元素出现的obscure问题

    前言 我们一般使用如下方式点击元素: elem = driver.find_element(...) elem.click() # 或者使用带等待条件的方式 elem = WebDriverWait( ...

  4. 【go笔记】使用WaitGroup控制协程退出

    前言 正常情况下,主协程一旦退出,其子协程也会全部中止并退出.为了阻塞主协程,可以使用time.Sleep(),也可以使用WaitGroup. 用法说明 // 导入sync import " ...

  5. embed简介

    go embed 是 Go 1.16 中引入的特性,它允许将文件嵌入到 Go 代码中,以便在运行时访问这些文件.这对于将静态资源(如 HTML.CSS.JavaScript 文件)直接嵌入到 Go 二 ...

  6. 【项目源码】JavaWeb网上购书系统

    JavaWeb网上购书系统 介绍 采用JSP.Servlet.MySQL.Tomcat8.0开发的网上购书系统. 软件架构 网上书城主要功能如下: (1) 前台(客户购买)部分: ① 用户管理:注册会 ...

  7. 特斯拉Dojo超算:AI训练平台的自动驾驶与通用人工智能之关键

    特斯拉公开Dojo超算架构细节,AI训练算力平台成为其自动驾驶与通用人工智能布局的关键一环 在近日举行的Hot Chips 34会议上,特斯拉披露了其自主研发的AI超算Dojo的详细信息.Dojo是一 ...

  8. 探秘移动端BI:发展历程与应用前景解析

    什么是移动端BI 维基百科 上对于 移动端商业智能的定义是这样的 > Mobile BI is a system that presents historical and real-time i ...

  9. 一个 println 竟然比 volatile 还好使?

    前两天一个小伙伴突然找我求助,说准备换个坑,最近在系统复习多线程知识,但遇到了一个刷新认知的问题-- 小伙伴:Effective JAVA 里的并发章节里,有一段关于可见性的描述.下面这段代码会出现死 ...

  10. Spring-Boot-Starter 学习笔记(1)

    Spring-Boot-Starter 1. 准备配置类和 Bean 对象 Spring Boot 提供了两个注解: @Configuration:Spring 提供的配置类注解,作用在类上,代表整个 ...