• 直接插入排序

要理解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. js 编译原理

    引擎:从头到尾负责整个javaScript 程序的编译过程和执行过程. 编译器: 负责语法分析以及代码的生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询, 并实施一套非常严格的 ...

  2. Clean Code 笔记 之 第二章

    你是否真正的会命名 前言 这是我第二次看这本书了(Clean Code)的时候,第一次看的时候是,看到某世界五百强在他们的代码中我竟然看不到一句注释,现在我还记得当时的情景,当我Download 下第 ...

  3. Ubuntu apache安装,配置,卸载

    阿里云服务器等记得到控制台开启防火墙 安装 sudo apt-get update sudo apt-get install apache2 配置 apache2 默认的几个配置文件 /etc/apa ...

  4. ZYNQ笔记(2):PS端——Hello World !

    PL端使用过后,来到了ZYNQ核心的部分:PS端,现在用Vivado软件对ZYNQ-7000开发板的PS端进行第一个程序设计:Hello World. 一.新建Vivado工程 1.打开Vivado, ...

  5. golang ---timeb

    golang 提供了以下两种基础类型 - 时间点(Time) - 时间段(Duration) 除此之外 golang 也提供了以下类型,做一些特定的业务 - 时区(Location) - Ticker ...

  6. 解密“CDO-首席数据官”的价值、挑战及发展

    数据,不论形态.格式和类型,已经迅速成为企业最有战略意义的资产:数据资产已经成为了可以形成业务洞察及优势的战略资源,数据的体量.多样性和复杂性也正以指数级增长.就像其他重要的企业资产,数据需要适当的管 ...

  7. java报错 pom.xml第一行报"org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project...

    https://www.cnblogs.com/appium/p/11168441.html 新建Maven项目时,每个pom文件第一行都报错. 一.问题分析 原因就是你的maven的配置文件不是最新 ...

  8. web api与mvc的区别

    MVC主要用来构建网站,既关心数据也关心页面展示,而Web API只关注数据 Web API支持格式协商,客户端可以通过Accept header通知服务器期望的格式 Web API支持Self Ho ...

  9. windows电脑ssh连接安卓termux

    最近跟风一个优秀的同事玩起了termux,明明一个简单的ssh,搞了我两天,差点崩溃 一怒之下,觉得很有必要写一篇博客警醒自己 初期,在某某荚下载了高级终端,然后跟着教程配置(https://www. ...

  10. Golang 模块(Module)官方手册

    官方原文: https://github.com/golang/go/wiki/Modules Go 1.11包括此处建议的对版本模块的初步支持.模块是Go 1.11中的实验性加入功能,并计划纳入反馈 ...