• 直接插入排序

要理解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. 【More Effective C++ 条款5】对定制的“类型转换函数”保持警觉

    1)C++允许内置数据类型之间进行隐式转换,比如char转int,int转double,对于内置数据类型的转换有详细的规则,但不管怎么样,这些都是语言提供的,相对安全,而且我们无法更改 对于自定义类的 ...

  2. spring的15个经典面试题

    总结Spring框架的15个经典面试题. 什么是Spring框架? Spring是一种轻量级框架,旨在提高开发人员的开发效率以及系统的可维护性. 我们一般说的Spring框架就是Spring Fram ...

  3. [跨域问题]ssm+vue前后台分离跨域问题解决方法

    跨域未解决时: Access to XMLHttpRequest at 'http://localhost:8080/vue/findall from origin 'http://localhost ...

  4. 适配器模式(Adapter Pattern)--设计模式

    在生活中,想用苹果充电线给安卓的手机充电时,因为两者的接口不一样,会导致充电口无法进行匹配, 这时候,就需要适配器,将安卓的充电口转化为苹果的接口,这样就可以充电啦.已有的类与新的接口不兼容问题是很普 ...

  5. Web应急:搜索引擎劫持

    当你直接打开网址访问网站,是正常的,可是当你在搜索引擎结果页中打开网站时,会跳转到一些其他网站,比如博彩,虚假广告,淘宝搜索页面等.是的,你可能了遇到搜索引擎劫持. 现象描述 从搜索引擎来的流量自动跳 ...

  6. 安装mysql驱动程序

    1.  MYSQL驱动:https://dev.mysql.com/downloads/connector/odbc/ 64 位版本:https://cdn.mysql.com//Downloads/ ...

  7. 开源分布式追踪系统 — Jaeger介绍

    目录 一.Jaeger是什么 二.Jaeger架构 1. 术语 2. 架构图 三.关于采样率 四.部署与实践 一.Jaeger是什么 Uber开发的一个受Dapper和Zipkin启发的分布式跟踪系统 ...

  8. mvc视图双下拉框联动

    html部分的代码 <tr class="trs"> <td class="item1"><div class="ite ...

  9. JS的数组进行切片slice

    代码 var arr = new Array(6) arr[0] = "George" arr[1] = "John" arr[2] = "Thoma ...

  10. linux系统shell基础知识入门

    什么是shell shell就是我们常说的命令行程序,它是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入要执行的命令.在Linux中安装多个shell是可行的,一般系统有默认的sh ...