• 直接插入排序

要理解shell排序,首先要把直接插入排序的基础打扎实。

学习资料:白话经典算法系列之二 直接插入排序的三种实现直接插入排序

根据我的思路,直接插入排序设置3重循环。

循环1:对 i=【无序序列】∈[ 1 , length ) 进行遍历。

循环2:对 j=【有序序列】∈[ 0 , i ) 进行遍历。

    比较:nums [ i ] < nums [ j ] (发现有序序列中有元素不符合降序原则、即无序序列中有元素比有序序列还要小

      循环3:将 index= i 的元素插入到 j 的位置,[ j , i ) 的元素依次向后移动。

java代码:

 class InsertSort{
int [] sortAns;
InsertSort(int[] nums){
int len=nums.length;
int i,j,k;
for(i=1;i<len;i++){//i代表已排序元素的个数,在【无序序列】中遍历
//在【 i , len 】的范围内,将无序元素插入到有序序列中
for(j=0;j<i;j++){//对【有序序列】进行遍历
if(nums[j]>nums[i]){//如果【有序序列】中的元素大于【无序序列】首元素
int tmp=nums[i];//临时保存【无序】
for(k=i;k>j;k--){//右移
nums[k]=nums[k-1];
}
nums[j]=tmp;
}
}
}
sortAns=nums;
}
public String toString(){
int i;
String str=new String("");
for(i=0;i<sortAns.length;i++) str+=String.valueOf(sortAns[i])+" ";
str+="\n";
return str;
}
}

  • Shell排序

shell排序使用了缩小增量的思想,具体原理不再赘述。引用学习链接:

算法篇---Shell排序(希尔)算法八大排序算法-shell 排序

不同的资料上有不同的实现方法。但具体思想是一致的。根据我的理解,我设计了5重循环:

循环1:用i表示增量,循环递减。(为保证最后一次循环的增量为1,应增设控制语句)

循环2:用j表示首元素的位置。j∈[0,length-i)

循环3:用k表示【无序序列】中各元素的下标。

循环4:用m表示【有序序列】中各元素的下标。

循环5:用n表示循环右移中的下标。

Java代码:

 class ShellSort{
int [] sortAns;
ShellSort(int[] nums){
int len=nums.length;
int i,j,k,m,n;
boolean ok=false;
for(i=len/2;i>=-1;i-=2){//第一层循环:增量递减
if(i<=0){i=1;ok=true;}
for(j=0;j+i<len;j++){//第二层循环:首元素步增
for(k=j+i;k<len;k+=i){//第三层循环:首元素加增量。对k【无序序列】进行遍历
for(m=j;m<k;m+=i){//第四层循环,对m【有序序列】进行遍历
if(nums[m]>nums[k]){//如果【有序】>【无序】(破坏了DESC规则)
int tmp=nums[k];//将【无序】插入到【有序】位置。保存临时变量【有序】
for(n=k;n>m;n-=i){
nums[n]=nums[n-i];//循环右移
}
nums[m]=tmp;
}
}
}
}
if(ok) break;
}
sortAns=nums;
}
public String toString(){
int i;
String str=new String("");
for(i=0;i<sortAns.length;i++) str+=String.valueOf(sortAns[i])+" ";
str+="\n";
return str;
}
}

直接插入排序与缩小增量插入排序(希尔排序ShellSort)的更多相关文章

  1. 希尔排序(Shellsort)

    首先,Shell是发明这个算法的人名,不是这个算法的思想或者特点. 希尔排序,也称为增量递减排序.基本思路,是把原来的序列,等效视为一个矩阵的形式.矩阵的列数,也称为宽度或者增量,记为w. 假设数组A ...

  2. 【算法】【排序】【插入类】希尔排序 ShellSort

    #include<stdio.h> #include <time.h> #include<stdlib.h> int main(){ ]; //设立随机数 sran ...

  3. 内部排序->插入排序->希尔排序

    文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是 ...

  4. 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)

    插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...

  5. 直接插入排序&希尔排序

    1.直接插入排序 时间复杂度O(n2) 工作原理: 通过构建有序序列,对于未排序数据,在已排序的序列中,从后向前扫描,找到相应的位置并插入. 插入排序在实现上,在从后向前扫描的过程中,需要反复把已排序 ...

  6. 排序算法Java代码实现(三)—— 插入排序 和 希尔排序

    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...

  7. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  8. Java实现希尔排序(增量递减排序)

    package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...

  9. [算法] 希尔排序 Shell Sort

    希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是: ...

随机推荐

  1. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  2. struts2拦截器的实现机制

    前言 最近老大让每周写一篇技术性的博客,想想也没啥写,就想着随便拿个以前的项目去研究研究五大框架的底层代码.本人水平有限,有不对的地方还望大家勿喷,指正! 开始之前先了解下strtus2的工作流程: ...

  3. 【linux】CentOS 查看系统时间,修改时区

    ===============CentOS 7.6================ 1.查看系统时间 date 查看当前系统时间以及时区结果是: Mon Jul 8 09:23:31 UTC 2019 ...

  4. tesseract-ocr 开源引擎使用

    国内资料比较少 一搜一大堆一样的 你抄我我抄你 前面怎么下载 怎么安装 怎么使用命令 怎么配中文字体 . 跳过.随便搜搜一大堆 科普下说下 box编辑工具  无论怎么搜jTessBoxEditor ( ...

  5. IIS配置——常见问题

    1.控制面板->程序和功能->打开或关闭Windows功能->Internet信息服务 勾选如下这些选项 2.新建一个网站 3.HTTP 错误 403.14 选择目录浏览然后启用即可 ...

  6. SpringApplication到底run了什么(上)

    在上篇文章:SpringBoot源码解析:创建SpringApplication对象实例中,我们详细描述了SpringApplication对象实例的创建过程,本篇文章继续看run方法的执行逻辑吧 p ...

  7. Mybatis映射文件中的标签的使用

    <foreach> <!-- foreach --> <delete id="delMulti" parameterType="java.u ...

  8. 如何在相同的类名中单独为选中元素设置JS

    很多时候,我发现对一个类名添加事件,每次都是所有同类名元素一起触发,使用 this可以仅对当前选中的元素应用事件 如 $('.guowai button').click(function() { /* ...

  9. JavaScript 总结[目录]

    ECMAScript 基础 一.JavaScript 基础 1.1 JavaScript 简介 1.2 JavaScript 书写位置 二.JavaScript 数据类型 2.1 JavaScript ...

  10. 使用paginate方法分页无法判断获取的数据是否为空

    问题:使用paginate方法分页无法判断获取的数据是否为空,在模板里面无法判断数据是否为空,比如在商品列表当中,当没有商品时无法判断生成的对象为空,所有就什么都不显示了. 解决办法: $newsDa ...