• 直接插入排序

要理解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. windows下zookeeper安装并发布成windows服务

    https://blog.csdn.net/yzy199391/article/details/80605195

  2. Go gRPC 调试工具

    概述 最近这段时间工作挺忙的,发现已经 3 周没更文了... 感谢你们还在,今天给大家分享一款 gRPC 的调试工具. 进入正题. 当我们在写 HTTP 接口的时候,使用的是 Postman 进行接口 ...

  3. 明解C语言 入门篇 第九章答案

    练习9-1 /* 将字符串存储在数组中并显示(其2:初始化) */ #include <stdio.h> int main(void) { char str[] = "ABC\0 ...

  4. 【java】javac命令在win10不可用,提示javac不是内部或外部命令,也不是可运行的程序【解决方法】

    JDK安装成功,并且配置了环境变量,java命令正常可以使用,但是javac命令提示 不是内部或外部命令,也不是可运行的程序 解决方法: 产生这个问题的原因,是因为环境变量的配置中,Path中配置使用 ...

  5. 深入V8引擎-AST(6)

    花了5篇才把一个字符串词法给解析完,不知道要多久才能刷完整个流程,GC.复杂数据类型的V8实现那些估计又是几十篇,天呐,真是给自己挖了个大坑. 前面几篇实际上只是执行了scanner.Initiali ...

  6. ansible简易使用

    一.本地环境: centos 7    192.168.10.10      主控机 centos 7    192.168.10.130    被控机 Windows7  192.168.10.13 ...

  7. 【转】fastjson-1.2.47-RCE

    Fastjson <= 1.2.47 远程命令执行漏洞利用工具及方法,以及避开坑点 以下操作均在Ubuntu 18下亲测可用,openjdk需要切换到8,且使用8的javac > java ...

  8. Java操作ElasticSearch之创建客户端连接

    Java操作ElasticSearch之创建客户端连接 3 发布时间:『 2017-09-11 17:02』  博客类别:elasticsearch  阅读(3157) Java操作ElasticSe ...

  9. jQuery Validate验证框架详解,提交前验证

    现在都用h5表单进行验证了,以下方式仅做回忆 https://www.runoob.com/jquery/jquery-plugin-validate.html <!DOCTYPE HTML P ...

  10. Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式

    一.inclusion_tag 1.作用 用于生成HTML片段,是数据由参数传入而变成动态 2.使用 # 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py ...