[算法]-排序算法之希尔排序

希尔排序算法思想

  • 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序.

  • 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

代码

要求

对于一个int数组,请编写一个希尔排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素小于等于2000。

测试样例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序一(好理解,但是比较麻烦)

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int count = 2, argument; //count:一个子序列中的元素数,argument:增量,也是子序列的数量while(count<=n){argument = n/count;for(int i=0;i<argument;i++){sortArgu(A,n,i,argument); //这里把一次插入排序过程抽出来}count *=2;}return A;}private:void sortArgu(int* A, int n, int begin, int argu){int temp, last, current;  //begin:子序列的起始元素current = begin+argu;// current: 一次插入排序中,当前要排序的元素,也就是无序部分的第一个元素while(current<n){last = current;while(last-argu>=begin){if(A[last]<A[last-argu]){temp = A[last];A[last] = A[last-argu];A[last-argu] = temp;}last -= argu;}current +=argu;}}
};

程序二

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){ //这里控制增量,最小值时为1,也就是一次普通的插入排序for(int i=step; i<n; i++){ //重点是在这里!!!这里是对第一个增量后的元素进行插入排序(插入排序时起始有序序列为1),没有把一个子序列单独抽出来进行排序(区别程序一),而是依次对第一个增量后的元素在其所属的子序列中进行插入排序for(j=i; j>=step; j-=step){if(A[j]<A[j-step]){temp = A[j];   //这里还可以进一步优化,详见程序三A[j] = A[j-step];A[j-step] = temp;}else{break;}}} }return A;}};

程序三

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){for(int i=step; i<n; i++){   //思想:找到待排序元素在有序部分的位置,然后插入,而不是每一次都把待排序元素与前一个元素交换位置。temp = A[i];     //记录下待排序元素for(j=i; j>=step; j-=step){if(temp<A[j-step]){  //有序部分的每一个元素都与待排序元素比较A[j]=A[j-step];  //满足上述条件,则元素后移}else{break;}}A[j]=temp;  //将待排序元素插入合适位置} }return A;}};

参考

1 白话经典算法系列之三 希尔排序的实现

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

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

相关文章

python tkinter button颜色变不了_tkinter多按钮颜色变化

我使用tkinter创建一个8x8按钮矩阵&#xff0c;当按下单个按钮时&#xff0c;它会添加到最终列表中(例如finalList((0,0)&#xff0c;(5,7)&#xff0c;(6,6)&#xff0c;…)&#xff0c;允许我快速创建8x8(x&#xff0c;y)坐标图像。我已经创建了一个带有按钮的窗口&#xff0…

应用spss可靠性分析软件

问卷调查的可靠性分析 一、概念&#xff1a; 信度是指依据測验工具所得到的结果的一致性或稳定性&#xff0c;反映被測特征真实程度的指标。一般而言&#xff0c;两次或两个測验的结果愈是一致。则误差愈小&#xff0c;所得的信度愈高&#xff0c;它具有下面特性&#xff1a;1、…

springmvc中的单例问题

1&#xff0c;springmvc实际上是基于一个叫做DispatcherServlet的servlet的。servlet按照以往的学习经验&#xff0c;他是单事例多线程的。 Servlet生命周期 1.装载Servlet。这项操作一般是动态执行的。然而&#xff0c;Server通常会提供一个管理的选项&#xff0c;用于在Serve…

设计模式 -- 亨元模式(FlyWeight Pattern)

用来尽可能减少内存使用量&#xff0c;适用于存在大量重复对象的场景&#xff0c;达到对象共享&#xff0c;避免创建过多对象的效果&#xff0c;提升性能&#xff0c;避免内存溢出。 定义&#xff1a; 使用共享对象有效支持大量细粒度对象。 适用场景&#xff1a; 系统中存在大…

python3.6使用mysql_Python之——Python3.6连接MySQL

只安装了Python是不能连接数据库的&#xff0c;还要安装Python连接MySQL的相关类库&#xff0c;Python2.7连接MySQL的类库很多&#xff0c;MySQL官方最新支持的Python为Python3.4.&#xff0c;如下图所示&#xff1a;那么&#xff0c;在Python3.6上如何实现连接MySQL的功能呢&a…

android解析json

android2.3提供的json解析类 android的json解析部分都在包org.json下&#xff0c;主要有以下几个类&#xff1a; JSONObject&#xff1a;可以看作是一个json对象 JSONStringer&#xff1a;json文本构建类 JSONArray&#xff1a;可以看作是json的数组 JSONTokener&#xff1a;js…

MVVM模式于MVP模式

MVC、MVP、MVVM这些模式是为了解决开发过程中的实际问题而提出来的&#xff0c;目前作为主流的几种架构模式而被广泛使用。 一.MVP模式(Model-View-Presenter):传统的开发是MVP模式(例如jquery) MVP是把MVC中的Controller换成了Presenter&#xff08;呈现&#xff09;&#xff…

HUNAN 11560 Yangyang loves AC(二分+贪心)

http://acm.hunnu.edu.cn/online/?actionproblem&typeshow&id11560&courseid0 题意&#xff1a;总共有n天,每天yangyang都需要一个快乐值,有m个队友,每个队友都会给阳阳一个快乐值(为2的幂),并且只能给一次,如果某一天队友给的快乐值达到yangyang需要的快乐值那么…

BrowserSync开发利器

2019独角兽企业重金招聘Python工程师标准>>> 大大节省开发时间。安装使用简单。使用步骤&#xff1a; 1、nodejs环境 安装 2、在项目中使用npm安装到本项目 3、对要监听的文件执行响应命令 官网更详细&#xff1a;http://www.browsersync.cn/#install 原理&#xf…

python字符串解析_Python-字符串解析-正则-re

正则表达式特殊字符序列&#xff0c;匹配检索和替换文本普通字符 特殊字符 数量&#xff0c;普通字符用来定边界更改字符思路字符串函数 > 正则 > for循环元字符  匹配一个字符# 元字符大写&#xff0c;一般都是取小写的反1. 0~9 整数          \d    …

algorithm -- 选择排序

选择排序是《导论》第一章课后习题&#xff0c;仿照插入排序&#xff0c;再次运用循环不变式来证明下算法的正确性&#xff0c;C 源码&#xff1a; // 交换函数 void swap( int& a, int& b ) {a a^b;b a^b;a a^b; } void selectSort( int *arr, int count ) {if( a…

OD 完美走位

题目描述&#xff1a; 在第一人称射击游戏中&#xff0c;玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位。假设玩家每按动一次键盘&#xff0c;游戏人物会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键…

layui upload 后台获取不到值

后台获取不到值方法一&#xff1a; <script>layui.use(upload, function () {var upload layui.upload;//执行实例var uploadInst upload.render({elem: #test1 //绑定元素, url: /Home/UploadFiles //上传接口, field: "fileNames" //添加这个属性与后台…

ueeditor无法上传图片_百度ue文本编辑器开发中无法上传图片

第一次发文&#xff0c;好紧张呀&#xff0c;不知道会不会没人看。之前用ue遇到了一些坑&#xff0c;没人看就当自己记录了笔记。第一次用&#xff0c;总是会遇到问题&#xff0c;可以先查看下百度ue的演示http://ueditor.baidu.com/website/onlinedemo.html和API http://fex.b…

SQL 语句优化--IN语句优化案例

为什么80%的码农都做不了架构师&#xff1f;>>> 今天客户系统升级&#xff0c;通过DMVs性能分析查了一下&#xff0c;升级后发现一个语句执行时间比较长&#xff0c;执行语句要好几秒钟&#xff0c;调出语句如下&#xff1a; select distinct field003 from ufi2j0…

Activity跳转

本例中MainActivity为&#xff1a;FirstActivity.java FirstActivity如下&#xff1a; package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java课程设计---项目数据库设计(含实体类)

1、数据库分析设计 将数据库命名为&#xff1a;db_student 分析系统中各角色之间的关系 2、表设计 &#xff08;1&#xff09;新建表tb_student&#xff08;学生表&#xff09; &#xff08;2&#xff09;新建表tb_admin&#xff08;管理员表&#xff09; &#xff08;3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文链接 作者&#xff1a;Jakob Jenkov 译者&#xff1a;airu 校对&#xff1a;丁一Java NIO 由以下几个核心部分组成&#xff1a;ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件&#xff0c;但在我看来&#xff0c;Channel&#xff0c;Buffer…

本地读取服务器Xml文件及本地读本地的xml

updateUrl"ServerUrl"(服务器路径) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019独角兽企业重金招聘Python工程师标准>>> Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录&#xff0c;一般存放临时缓存数据如果使用上面的方法&#xff0c;当你的应用在被用户卸载后&#xff0c;SDCard/Android/dat…