9个元素换6次达到排序序列_C语言必学的12个排序算法:希尔排序(第3篇)

579e0b057a1f92b488320d7300a092e3.png

基本思想

希尔排序(Shell's Sort),以发明人命名,又称为缩小增量排序,也是一种插入排序算法。

主要思想:直接插入排序算法时间和待排数据有关,其平均复杂度是O(n^2),但是在待排数据已经有序的情况下,其复杂度可以达到O(n),因为不需要移动数据。

希尔排序就是利用这种特点,先将整个待排数据记录分割成若干个子待排数据记录,然后分别进行直接插入排序,当整个待排数据记录“基本有序”时,再对整个数据记录进行完整的一次直接插入排序。通俗地来说,先“跳着”给待排序列排序几个数据,让待排数据基本有序的情况,再直接插入排序。

举例来说:

例如:给定10个整数:(4,3,1,2,6,5,0,9,8,7) 从小到大排序。

第一步:

假定先分成五个子序列,请注意增量分割,例如第1个元素和第6个元素是一个子序列,第2个元素和第7个元素是一个子序列。最终分成 (4,5)(3,0)(1,9)(2,8)(6,7),对子序列分别排序,最终得到结果:

(4,0,1,2,6,5,3,9,8,7),调整了(3,0)的位置。

第二步:

分成三个子序列,缩小增量,因此第1个元素和第4个元素、第7个元素、第10个元素是一个子序列。最终分成(4,2,3,7)(0,6,9)(1,5,8),同样对子序列的数据进行排序,得到结果:(2,3,4,7)(0,6,9)(1,5,8),最终得到:

(2,0,1,3,6,5,4,9,8,7)

第三步:

分成一个子序列,也就是增量为1,此时和直接插入排序一样,对整个序列进行直接插入排序即可。

算法有效的特征时:使用增量分割序列时,有可能会让“乱序”的数据“跳跃到”前面,这样不用移动位置,从而减少移动的次数。

希尔排序算法时间复杂度分析是个复杂的难题,其针对每个队列的所选的增量序列不同,时间不同。增量序列的值应满足没有除1以外的公因子,并且最后一个增量值为1,例如......11,9,5,3,2,1等。

代码实现

希尔排序与直接插入排序相比:

1.需要进行多次子排序过程,每次子排序也是直接插入排序。

2.需要一个增量序列,分割整个待排序列。

/*
#include <stdio.h>// 对分割每个子序列进行排序 
// dk比较子序列增量 
void shell_insert(int a[], int length, int dk)
{int i,j,t;for(i=dk; i<length; i++){if(a[i] < a[i-dk] ){t = a[i];for(j=i-dk; j>=0 && t < a[j]; j=j-dk)a[j+dk] = a[j];a[j+dk] = t;}}
}void shell_insert_sort(int a[], int length, int dk[], int dk_length)
{int i;for(i=0; i<dk_length; i++){shell_insert(a, length, dk[i]);}
}
int main(void)
{int a[10] = {4,3,1,2,6,5,0,9,8,7};int dk[3] = {5,3,1};shell_insert_sort(a,10,dk,3);int i;for(i=0; i<10; i++)printf("%d ", a[i]);return 0;
}

其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

cab1aac3079d445616bcc33e02b35801.png

5691f4d0b18c4544e002807b90fcefe8.png

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

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

相关文章

java快捷键禁用_pycharm 掌握这些快捷键,你就是大神!!

最重要的快捷键1. ctrlshiftA:万能命令行 2. shift两次:查看资源文件新建工程第一步操作1. module设置把空包分层去掉,compact empty middle package 2. 设置当前的工程是utf-8,设置的Editor-->File Encodings-->全部改成utf-8,注释1. ctrl/:单行注释光标操作1. ctrlalte…

如何在 5 分钟内读懂区块链的架构思维?

作为入门者&#xff0c;如何在最短的时间了解区块链技术&#xff0c;区块链思维&#xff0c;以及比特币的金融原理呢&#xff1f;本文尝试从比特币的架构设计思维出发&#xff0c;让人从宏观上搞清楚区块链的技术本质。 本文授权转载自阿里技术 作者 | 郑吉 区块链不是一种技术…

arduino 上传项目出错_Arduino多核编程:简单例子

不管你是Arduino领域的新手还是经验丰富的开发人员&#xff0c;很可能你还只使用过单核在进行编程。 这没有什么好笑的---- 事实上&#xff0c;直到几天前我才使用Arduino IDE进行了第一次多核编程。 我和所有其他Arduino粉丝都非常喜欢IDE的易用性以及MicroController 开发所需…

Hadoop-RPC应用demo

Hadoop里的rpc框架可以单独拿出来使用。jar包全在hadoop-common工程里。 导入hadoop-common工程里&#xff08;hadoop-2.7.3为例&#xff09;&#xff1a; hadoop-common-2.7.3.jar \hadoop-2.7.3\share\hadoop\common\lib下的全部jar包 实例 rpc.client 客户端 rpc.pr…

宝塔面板服务器ip地址修改_「网站」快速搭建服务器环境及网站

目录&#xff1a;「NAS」我的搭建NAS全过程在文章开头我想说明的是&#xff0c;此文章中所使用的工具为 BT 面板即宝塔面板&#xff0c;适合小白使用但是对于想要提升个人能力来说&#xff0c; BT 面板并不是一个好选择&#xff0c;而作为新手来说&#xff0c;可以使用该面板进…

杨辉三角python_Python面试150题汇总,都是常问的面试题!

周末&#xff0c;Python面试题每日一题暂停更新&#xff0c;下面把最近整理的1-50篇Python面试文整理一下&#xff0c;平时文章都放在比较末尾&#xff0c;阅读量都不高&#xff0c;相信很多人都没看过&#xff0c;如果对于Python感兴趣的&#xff0c;建议可以认真阅读一下&…

java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.SCAN_RESULTS flg

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.nokia.wlanapp, PID: 18526java.lang.RuntimeException: Error receiving broadcast Intent { actandroid.net.wifi.SCAN_RESULTS flg0x4000010 (has extras【外部】) } in com.nokia.wlanapp.Receive…

php处理上传文件的步骤,php文件上传步骤

我们在开发网站的时候&#xff0c;经常会遇到需要制作文件上传功能&#xff0c;下面我们就为大家介绍一下php制作文件上传功能的详细步骤。推荐教程&#xff1a;PHP视频教程第一步&#xff1a;创建一个文件上传表单允许用户从表单上传文件是非常有用的。请看下面这个供上传文件…

matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数

帮助你理解线性代数与机器学习紧密结合的核心内容下文节选自北大出版社《机器学习线性代数基础》, [遇见]已获授权许可. 这本书不同于传统教材, 从新的角度来介绍线性代数的核心知识, 讲解也很棒, 又刚好参加参加了当当每满100-50的活动, 感兴趣的朋友可以关注下. 傅里叶级数&a…

c++实现超声回波包络检测_超声波物位计的选用

超声波物位计超声波在气体、液体和固体介质中以一定速度传播时因被吸收而衰减&#xff0c;但衰减程度不同&#xff0c;在气体中衰减最大&#xff0c;而在固体中衰减最小&#xff1b;当超声波穿越两种不同介质构成的分界面时会产生反射和折射&#xff0c;且当这两种介质的声阻抗…

Android应用开发:CardView的使用及兼容

原文&#xff1a;http://blog.csdn.net/airk000/article/details/39520977 点击阅读原文 --------------------------------------------------------------- 引言 在Google I/O 2014上&#xff0c;Google公布了Android L Preview版本&#xff0c;此版本的UI有了非常大的改变…

云海技术u盘怎么恢复成普通盘_BITLOCKER加密中断数据无法读取恢复一例

同行求助此问题&#xff0c;密码客户是知道的&#xff0c;输入密码后提示如图&#xff1a;如果点击RESUME则提示如下&#xff1a;无视提示关闭提示框后再次提示分区需要格式化&#xff1a;PC3000 DE中可以添加虚拟驱动器解析BITLOCKER加密的分区&#xff0c;但该例添加虚拟驱动…

git 未能顺利结束(退出码1)

按照这个博客上安装完小乌龟git后&#xff1a;https://blog.csdn.net/jdsjlzx/article/details/51098588win10下安装完乌龟git后无法上传文件进行文件上传时出现错误如下&#xff1a;git 未能顺利结束&#xff08;退出码1&#xff09;&#xff08;922ms2018/4/17 22&#xff1a…

交际过程的两个基本环节_男女相处,若不介意这些“小动作”,基本可以确定“关系暧昧”...

当你对我说再见的时候&#xff0c;我看到你的笑容里有祝福&#xff0c;眼神里却有遗憾……——南明夫人爱情中最美好幸福的事&#xff0c;莫过于你深爱的人&#xff0c;恰好也钟情于你。这种两情相悦的爱情总是如此难得&#xff0c;让人心生羡慕。这份甜蜜与美好&#xff0c;让…

Android之NetworkOnMainThreadException异常

原文链接&#xff1a;http://blog.csdn.net/mad1989/article/details/25964495 点击阅读原文 ------------------------------------------------------------------ 看名字就应该知道&#xff0c;是网络请求在MainThread中产生的异常 先来看一下官网的解释&#xff1a; Cl…

中国信通院金融科技负责人韩涵:大数据是生产资料的变革,区块链是生产关系的变革...

在近日召开的“2018中国金融科技产业峰会”上&#xff0c;中国信息通信研究院主任工程师、金融科技负责人韩涵正式发布了《中国金融科技前沿技术发展趋势及应用场景研究报告》&#xff0c;详细讲解了A&#xff08;人工智能&#xff09;B&#xff08;区块链&#xff09;C&#x…

java简单纸牌游戏_活动回顾 | 畅玩法语纸牌游戏

11月17日下午&#xff0c;20级小伙伴们迎来了第二次法语角活动&#xff01;这次外教Anne-Flore Vrac 老师为同学们安排了丰富有趣的法语纸牌游戏&#xff0c;快来一起回顾活动的精彩瞬间吧&#xff01;集体游戏一&#xff1a;从1到30老师首先带领同学们进行了“从1到30”的小游…

人脸识别门禁_小区人脸识别门禁或取代传统门禁刷卡方式

可以说&#xff0c;社区是一个人口聚集的小型社会。首先社区的人流量很大&#xff0c;进出是十分频繁。其次&#xff0c;社区的大门以及各处进出口是业主与访客、外来人员等进进出出最关键的通道。因此&#xff0c;每个社区都会有一套成型的门禁系统&#xff0c;常见的是使用门…

元类编程--property动态属性

from datetime import date, datetime class User:def __init__(self, name, birthday):self.name nameself.birthday birthdayself._age 0# def get_age(self):# return datetime.now().year - self.birthday.yearproperty #动态属性def age(self): #属性描述符&#x…

vscode运行python文件_vscode怎么运行python文件

1、首先需要确保安装了VScode的Python插件&#xff0c;打开Python脚本&#xff0c;可以直接拖入&#xff0c;点击文件&#xff0c;点击首选项里的用户设置&#xff0c;这时候会用户设置配置文件。2、然后在左边文件CtrlF搜索Python关键字&#xff0c;找到pythonPath所在行3、然…