排序:插入排序与希尔排序

插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

插入排序分析



def insert_sort(alist):# 从第二个位置,即下标为1的元素开始向前插入for i in range(1, len(alist)):# 从第i个元素开始向前比较,如果小于前一个元素,交换位置for j in range(i, 0, -1):if alist[j] < alist[j-1]:alist[j], alist[j-1] = alist[j-1], alist[j]alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)

时间复杂度

  • 最优时间复杂度:O(n)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定


希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序过程

希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。

例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样(竖着的元素是步长组成):

13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序:

10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。这时10已经移至正确位置了,然后再以3为步长进行排序:

10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为:

10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序(此时就是简单的插入排序了)

希尔排序的分析

def shell_sort(alist):n = len(alist)# 初始步长gap = n / 2while gap > 0:# 按步长进行插入排序for i in range(gap, n):j = i# 插入排序while j>=gap and alist[j-gap] > alist[j]:alist[j-gap], alist[j] = alist[j], alist[j-gap]j -= gap# 得到新的步长gap = gap / 2alist = [54,26,93,17,77,31,44,55,20]
shell_sort(alist)
print(alist)

时间复杂度

  • 最优时间复杂度:根据步长序列的不同而不同
  • 最坏时间复杂度:O(n2)
  • 稳定性:不稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jieba分词提取小说人名

文章目录1. 读入文本2. 分词3. 计数4. 排序5. 添加用户字典以《神雕侠侣》为例&#xff1a; 使用 jieba.posseg获取词性&#xff0c;人名的词性为 nr 1. 读入文本 import jieba.posseg as psg with open(shendiaoxialv.txt,encodingutf-8) as f:text f.readlines()print(te…

延迟加载

/*** namespace DOM Ready* 兼容某些页面头部没有引用jquery* function* param {Function} fn* example* DOMReady(fn)*/ window.DOMReady function() {var evt [],isReady false,guid 1,randomKey new Date();/** ignore 执行并销毁队列事件 */var fire function() {if …

Spark Worker源码

目录 1、概述 2、LaunchDriver 3、LaunchDriver 4、总结 1、概述 worker肯定是实现RPC通信的&#xff0c;否则别人没法给你发消息。他继承的是ThreadSafeRpcEndpoint&#xff0c;ThreadSafeRpcEndpoint是线程安全的&#xff0c;意味着处理一条消息完成后再处理下一个消息。换…

排序:快速排序与归并排序

快速排序 快速排序&#xff08;英语&#xff1a;Quicksort&#xff09;&#xff0c;又称划分交换排序&#xff08;partition-exchange sort&#xff09;&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都…

LeetCode 764. 最大加号标志(DP)

文章目录1. 题目2. 解题1. 题目 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中&#xff0c;除了在 mines 中给出的单元为 0&#xff0c;其他每个单元都是 1。网格中包含 1 的最大的轴对齐加号标志是多少阶&#xff1f;返回加号标志的阶数。如果未找到加号标志&#xff…

Android启示录——开始Android旅途

为了明年可以开始进行android程序开发&#xff0c;开始从零开始学习android&#xff0c;仅以此代表第一步开始(*^_^*)&#xff0c;开始搭建环境…… 1. 软件下载 http://developer.android.com/sdk/index.html 下载Android开发所需的ADT、SDK....&#xff08;里面会有全部东西&…

机器学习基础—Kaggle泰坦尼克预测(完整分析)

1.引言 我们先找个简单的实际例子&#xff0c;来看看&#xff0c;所谓的数据挖掘或者机器学习实际应用到底是怎么样一个过程。 2.背景 2.1 关于Kaggle Kaggle是一个数据分析建模的应用竞赛平台&#xff0c;有点类似KDD-CUP&#xff08;国际知识发现和数据挖掘竞赛&#xff09;&…

Spark Executor解析

目录 1、Spark Executor如何工作 2、Spark Executor工作源码 1、Spark Executor如何工作 当Driver发送过来Task的时候&#xff0c;其实是发送给CoarseGrainedExecutorBackend这个RPCEndpoint&#xff0c;而不是直接发送给Executor&#xff08;Executor由于不是消息循环体永远…

Cassandra1.2文档学习(12)—— hint机制

参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_hh_c.html Hint机制是Cassandra的特性当一致性不要求时保证了写入的高可用性。但临时故障发生如网络问题&#xff0c;Hint机制显著地提升了反应的一致性。通过配置c…

LeetCode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复(vector + 哈希)

文章目录1. 题目2. 解题1. 题目 设计一个支持在平均 时间复杂度 O(1) 下&#xff0c; 执行以下操作的数据结构。 注意: 允许出现重复元素。 insert(val)&#xff1a;向集合中插入元素 val。remove(val)&#xff1a;当 val 存在时&#xff0c;从集合中移除一个 val。getRando…

Stage划分和Task最佳位置

目录 1、Job Stage划分 2、Task最佳位置 3、总结 3.1 Stage划分总结&#xff1a; 3.2 Task最佳位置总结&#xff1a; 1、Job Stage划分 Spark Application中因为不同的Action触发众多的Job&#xff0c;也就是说一个Application中可以有很多的Job&#xff0c;每个Job是由是…

LwIP编译方法以及选项说明

条件编译命令作用说明IP_SOF_BROADCAST LWIP_IGMP 转载于:https://www.cnblogs.com/motadou/p/3537581.html

LeetCode 1636. 按照频率将数组升序排序(哈希+排序)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;请你将数组按照每个值的频率 升序 排序。 如果有多个值的频率相同&#xff0c;请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2,2,2,3] 输出…

Ubuntu16.04直接修改root密码

Ubuntu16.04系统中&#xff0c;因为误操作导致管理员密码丢失或无效&#xff0c;并且忘记root密码&#xff0c;此时无法进行任何root/sudo权限操作。可以通过GRUB重新设置root密码&#xff0c;并恢复管理员账户到正常状态。 工具/原料 • Ubuntu16.04操作系统 重置root密码 启…

TaskScheduler相关

目录 1、DAGScheduler与TaskScheduler 2、TaskScheduler与SchedulerBackend 3、任务调度过程总结 1、DAGScheduler与TaskScheduler DAGScheduler面向我们整个Job划分出了Stage&#xff0c;划分了Stage是从后往前划分的&#xff0c;执行的时候是从前往后&#xff0c;每个Stag…

网上支付心案例payment

案例的作用及用法参考该类的说明注释 工具类分别有&#xff1a; package cn.itcast.utils; import java.util.Properties; /** * 读取配置文件 * */ public class ConfigInfo { private static Properties cache new Properties(); static{ try …

LeetCode 1637. 两点之间不包含任何点的最宽垂直面积

文章目录1. 题目2. 解题1. 题目 给你 n 个二维平面上的点 points &#xff0c;其中 points[i] [xi, yi] &#xff0c;请你返回两点之间内部不包含任何点的 最宽垂直面积 的宽度。 垂直面积 的定义是固定宽度&#xff0c;而 y 轴上无限延伸的一块区域&#xff08;也就是高度为…

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和

原题:有一序列a&#xff0c;大小为n&#xff0c;分为2部分,序列元素的值任意整形数&#xff0c;无序&#xff1b; 要求&#xff1a;通过交换a,b中的元素&#xff0c;使[序列a元素的和]与[序列b元素的和]之间的差最小&#xff0c;用python写。 #codingutf-8 # 1.将两序列合并为一…

Task执行流程

1、源码走读 &#xff08;1&#xff09;当Driver中的SchedulerBackend&#xff08;Standalone模式为CoarseGrainedSchedulerBackend&#xff09;给ExecutorBackend&#xff08;Standalone模式为CoarseGrainedExecutorBackend&#xff09;发送LaunchTask之后&#xff0c;Coarse…

一段挂起进程中所有线程的代码

今天看书核心编程看到第7章&#xff0c;中的一段代码很有意思&#xff0c;win7下对记事本进程进行测试&#xff0c;可以挂起&#xff0c;挺有意思的 //windows核心编程 第5版中的一段代码 /* 函数功能:挂起进程中的所有线程 参数1:进程ID 参数2:若为TRUE时对进程中的所有线程调…