希尔排序 最坏时间_排序算法(2)

本文介绍插入排序和希尔排序,插入排序是较为常见的排序算法,希尔排序也是基础的排序算法,废话不多说,具体来看一下两种算法。

aa8c442bb373cc7f3cc797bd2c5c517d.png

插入排序

插入排序的基本思想是拿到下一个插入元素,在已经有序的待排数组部分找到自己的位置,然后进行数据的移动,完成该元素的排序,依次类推,直到整个待排数组有序,初始状态待排数组的有序部分仅有一个元素。代码如下:

public static void sort(int[] nums) { Arrays.nonBlank(nums); for (int i = 1; i < nums.length; i++) { for (int j = i; j > 0; j--) { if (nums[j] < nums[j - 1]) { int temp = nums[j]; nums[j] = nums[j - 1]; nums[j - 1] = temp; } } }}

上面这种方式两两数据交换,换到合适位置,每次交换多了两次赋值操作,下面是实现的标准模式:

public static void sort2(int[] nums) { Arrays.nonBlank(nums); for (int i = 1; i < nums.length; i++) { int temp = nums[i]; // 记录插入值 int j; for (j = i; j > 0 && temp < nums[j - 1]; j--) { nums[j] = nums[j - 1];// 寻找位置,能够减少赋值的次数 } nums[j] = temp;// 找到位置,完毕 }}

以上就是插入排序的两种实现方式,并没有改进,其时间复杂度为O(n^2),妥妥的两层循环,另外插入排序是稳定排序,存不存在一种改进的插入排序呢?答案是有的,这就是我们下面要介绍的希尔排序;

希尔排序

希尔排序是插入排序的改进版。主要改进思路是减少插入排序中数据的移动次数,设置步长,在初始数组较大时取较大步长,通常初始步长为待排数组长度1/2,此时只有两个元素比较,交换一次,此时数组为部分有序数组;之后步长依次减半直至步长为1,即为插入排序,此时数组已接近有序,所以插入元素时数据移动次数会相对较少,效率得到提高,实现代码如下:

public static void sort(int[] nums) { Arrays.nonBlank(nums); int N = 0 + nums.length; for (int gap = N / 2; gap > 0; gap /= 2) { for (int i = gap; i < N; i++) { insert(nums, i, gap); } }}​private static void insert(int[] nums, int i, int gap) { int inserted = nums[i]; int j; for (j = i - gap; j > 0 && nums[j] > inserted; j -= gap) { nums[j + gap] = nums[j]; } nums[j + gap] = inserted;}

既然为改进算法,那么相比较插入排序,希尔排序的到底快了多少呢?为此特意去找了资料,一般书上都说希尔排序的时间复杂度是O(n^3/2),但是学过算法的都知道有最坏时间复杂度的,希尔排序的时间复杂度其实是和增列序列有关系的,即我们程序实现的步长,{1,2,4,8,...}这种序列就是我们程序中实现的这种,并不是很好的增量序列,使用这个增量序列的时间复杂度(最坏情形)是O(n^2),Hibbard提出了另一个增量序列{1,3,7,...,2^k-1}(质数增量),这种序列的时间复杂度(最坏情形)为O(n^1.5),这个提高就很厉害了,只是修改一个算法的一个参数;Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109,...},最后这个就当是科普小知识吧,因为给你你也不一定能用,请原谅我的直接,当别人说希尔排序的最坏时间复杂度是O(n^2)的时候,你也可以给他们科普一下,希尔排序的最坏时间复杂度是可以做到O(n^1.3)的。

总结

插入排序感觉是最为直观的排序方式,如果有人没有学过算法,人们最直接的排序方式就是,一个一个去找数字的位置,确定,然后再去找下一个,所以思想很简单,但是我们看到即时这样简单地排序思想,到了希尔这里,也能玩出花,所以对任何东西,尤其是简单的事物,都要心怀敬畏啊。

构成我们学习最大障碍的是已知的东西,而不是未知的东西。——贝尔纳

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

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

相关文章

题目1017:还是畅通工程(最小生成树初步应用)

题目链接&#xff1a;http://ac.jobdu.com/problem.php?pid1017 详解链接&#xff1a;https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码&#xff1a; // // 1017 还是畅通工程.cpp // Jobdu // // Created by PengFei_Zheng on 18/04/2017. // Copyright © 201…

maven自带clean_maven之clean、install命令

1、进入到maven根目录&#xff0c;执行mvn compile命令会在根目录生成target文件(参照maven之helloworld案例)&#xff0c;如下图&#xff1a;2、执行mvn clean可将根目录下生成的target文件移除3、mvn install命令Speak.java代码package com.maven;import com.maven.HelloWorl…

多对一(一对多)的双向关联

一个组&#xff08;Group&#xff09;有多个用户&#xff08;User&#xff09;&#xff0c;进行多对一&#xff08;一对多&#xff09;的双向配置&#xff0c;在数据库中生成的表结构如下图&#xff1a; Annotation配置&#xff1a; Group: 1 package com.bjsxt.hibernate;2 3 …

angularjs 同步請求_angularjs $q、$http 处理多个异步请求

在实际业务中经常需要等待几个请求完成后再进行下一步操作。但angularjs中$http不支持同步的请求。解决方法一&#xff1a;$http.get(url1).success(function (d1) {$http.get(url2).success(function (d2) {//处理逻辑});});解决方法二&#xff1a;then中的方法会按顺序执行。…

隧道不能访问web vxaln_SpringBoot实现本地存储文件上传及提供HTTP访问服务

笔者计划为大家介绍分布式文件系统&#xff0c;用于存储应用的图片、word、excel、pdf等文件。在开始介绍分布式文件系统之前&#xff0c;为大家介绍一下使用本机存储来存放文件资源。二者的核心实现过程是一样的&#xff1a;上传文件&#xff0c;保存文件(本节是本地磁盘)返回…

poj1986 Distance Queries(lca又是一道模版题)

题目链接&#xff1a;http://poj.org/problem?id1986 题意&#xff1a;就是老问题求val[u]val[v]-2*val[root]就行。还有这题没有给出不联通怎么输出那么题目给出的数据一定 是联通的。 题解&#xff1a;就是单纯的lca。 #include <iostream> #include <cstring> …

httpsurlconnection 写不进去authorization值_23. 假设检验的时候为什么常写p lt; 0.05,而不写具体的p值?...

在进行假设检验的时候&#xff0c;如果p值小于设定的临界值&#xff0c;比如0.05或0.01、0.001等&#xff0c;人们常常会写p<0.05、p<0.01、p<0.001, 而没有写具体的p值。这种传统是曾经的技术限制造成的&#xff0c;而在今天是不被提倡的&#xff0c;现代更提倡的是直…

修改form_Vue通过阿里云oss的url连接直接下载文件并修改文件名

我测试过很多遍,想要通过a标签的形式来直接点击url下载文件并重命名但是都失败了,最终只能下载却不能重命名 所以 换了java后台来修改名字.以下代码我做的网页是点击文件直接下载直接下载下来了,一开始的文件名是上传到oss时以id命名的名字,现在下载的时候想改名,遇到了问题,所…

支付宝 报错 rsa_private read error : private key is NULL解决方法

原因: 真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示 调试iOS 支付宝SDK的时候&#xff0c;执行demo。把Partner(合作商户 ID)Seller(账户 ID)RSA public key(支付宝公钥)RSA private key(商户私钥)执行的时候&#xff0c;报错 rsa_private…

nasa注册_今天是黑洞星期五!

What is a black hole? A black hole is an astronomical object with a gravitational pull so strong that nothing, not even light, can escape it. A black hole’s “surface,” called its event horizon, defines the boundary where the velocity needed to escape e…

Sort List[leetcode] 由归并排序的递归和循环,到本题的两种解法

归并排序能够有两种思路----top-down 和 bottom-up top-down: 递归实现&#xff0c;将数组分成两半。分别处理。再合并。 伪代码例如以下&#xff1a; split ( A[], l, r) {if ( r - l < 2) return;m (r l) / 2;split ( A, l, m); //split A[l…m-1]split ( A, m, r); //s…

qcap 教程_高通平台抓取ramdump及使用qcap解析,ramdumpqcap

高通平台抓取ramdump及使用qcap解析&#xff0c;ramdumpqcap高通死机或者查找休眠问题可以通过ramdump来分析&#xff0c;具体步骤先确认下内核配置了CONFIG_MSM_DLOAD_MODE&#xff0c;并确认download_mode为1grep -rin CONFIG_MSM_DLOAD_MODE out/target/product/xxxxx/obj/K…

STM32学习笔记(五)——通用定时器计数延时

STM32定时器概述 STM32F40x系列总共最多有14个定时器&#xff0c;定时器分为三类&#xff1a;基本定时器、通用定时器和高级定时器。它们的都是通过计数来达到定时的目的&#xff0c;和51的定时器差不多&#xff0c;基本原理都是一样的&#xff0c;就是功能多了一些&#xff0c…

win10user文件夹迁移_Win10用户文件如何从系统盘转到其他盘

系统盘什么?就是放置Windows系统的硬盘。安装系统放在系统盘里&#xff0c;本身已经占了很大空间&#xff0c;可是用户文件也放在系统盘里。Win10如何把用户文件转移到非系统盘?下面就Win10消费者预览版Build9926为例&#xff0c;与大家分享一下把Win10用户文件移动到非系统盘…

第十九讲:职责链模式

public class CarBodyHandler extends CarHandler{Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}} public abstract class CarHandler {public abstract void HandlerCar(); } public class CarHeadHandle…

十道解分式方程及答案_100道八年级分式方程及答案.

天.一辈子也打不完哪.再问&#xff1a; 50到吧再答&#xff1a; http://zhidao.baidu.com/question/238264424.html 个网址里面有一些&#xff0c;因为有字数限制&#xff0c;我不好发题目给你&#xff0c;所以你自己去看看吧。 例 解方程&#xff1a; (1)2xxx31; (2)15x215 x1…

四阶行列式直接展开_四阶行列式的完全展开式共有多少项

展开全部 共24项。 1.将该行列式前三列重复书写在该行列式的右边,可在前四列中作出两条对角线,然e5a48de588b662616964757a686964616f31333365663463后在此七列中作出相应的平行线,可得(图表一) 2.作乘积关系,可得如下八项: a11a22a33a44,a12a23a34a41,a13a24a31a42,a14a2…

c++ 返回智能指针_C++核心指南(17) I.11 禁止使用指针(T*)或引用(T)来转移所有权...

I.11: 永远不要使用原始指针(T*)或引用(T&)来转移所有权原因如果对调用者或被调用者是否拥有对象有任何疑问&#xff0c;就会发生泄漏或过早析构。示例考虑:X* compute(args) // 不要这样做 { X* res new X{}; // ... return res; }谁来删除返回的X&#xff1f;当compute返…

for-each循环

for-each循环又叫for增强循环&#xff0c;不需要下标就可以顺序的便历整个数组例如 package cn.hsop.fentian;public class Forxunhuan {public static void main(String[] args) {int[] num { 5, 8, 3, 6 };//定义数组int maxnum[0] ;//假设最大值//遍历数组for (int a : num…

mysql8.0.13 32位下载_MySQL8.0下载-MySQL数据库8.0下载 v8.0.11官方版(32位/64位)--pc6下载站...

mysql是一款数据库管理系统&#xff0c;mysql一般网站开发者或者数据库开发者会用到&#xff0c;mysql拥有体积小巧、读取和存储速度快的特点&#xff0c;新版本完全脱了MylSAM存储引擎&#xff0c;改善了扫描性能&#xff0c;同时还重构了sql分析器&#xff0c;赶快下载使用吧…