1先让我们回顾下插入排序

//比如有组数据:int[] arr = {8, 6, 2, 3, 1, 5, 7, 4};

文字概述: 假设第一个元素为最小数字。那么我们就要从index=1开始往后循环,依次拿后面的数字,与前面的数字依次比较,找出最小数字。也就是当index =1,那就是 arr[1] 和 arr[0] 比较。当index = 2 时,就是用 arr[2] 与 arr[1] 比较得出一个最小值,然后再与 arr[0] 比较。最终完成从小到大的排序。

所以代码如下

  //{8, 6, 2, 3, 1, 5, 7, 4}    public void inseartSort(int[] arr) {    //所以外层循环,我们跳过第一个元素 8,拿后面的数和前面的数比较        for (int i = 1; i < arr.length; i++) {      //1、这层的循环是拿后面的数和前面的【依次比较】得出最小数            //2、下面内层循环不知道怎么写,我们可以先来拆分下逻辑            //   (1)先看外层循环,index = 1,我们要拿arr[1]与arr[0]比较,较小的数字排在前面            //   (2)继续看外层循环,index = 2,我们首先要拿arr[2]和arr[1]作比较,得出最小数后,继续和arr[0]做比较。            //         相当于index--了。      //   (3)综上所述:外层循环的起始点,就是内层循环的起始点,其次index--才能依次和前面的数比较,做好排序。            //        既然是index--,那么index要满足的条件是index > 0 。不然异常。所以代码如下            for (int j = i; j > 0; j--) {                if (arr[j] < arr[j - 1]) {                    int temp = arr[j - 1];                    arr[j - 1] = arr[j];                    arr[j] = temp;                }            }        }    }

2希尔排序“

了解过插入排序算法的都知道。一组很长的数据里。如果局部有序数字越多,插入排序越高效,性能越好。

希尔算法:就是利用了这个插入排序的特点改进的。他这里有个增量gap的概念。我们暂且不去探讨增量序列带来的时间复杂度。

假如还是那组数据:{8, 6, 2, 3, 1, 5, 7, 4}。假设这里的增量是 gap = arr.length/2。也就是4,他会对数组,逻辑分组成几份(这里也能看成,增量是几就是分几份),然后依次对逻辑分组里进行插入排序,其数组还是同一个数组。排序好之后再用 gap /= 2。也就是2。继续逻辑分组,继续插入排序。这样原始数组内大部分数据都是有序数据。最后 gap = 1,对这大部分数据都是有序数据的数组进行插入排序。那么速度就快很多,性能方便也很高效。

可能这么说很笼统,请看剖析

gap=4 时 那么就是

  • arr[0]和arr[4] 一组

  • arr[1]和arr[5] 一组

  • arr[2]和arr[6] 一组

  • arr[3]和arr[7] 一组

这样是逻辑分组,

  • 8和1排序后: 1 8;

  • 5和6排序后: 5 6;

  • 2和7排序后: 2 7;

  • 3和4排序后: 3 4。

竖着看,此时排序得到:1 5 2 3 8 6 7 4

gap = 2 时

gap为2时就相隔2,去分组,当然也就是分成2组

gap=2时的分组为

  • 1 2 8 7;排序后得到 1 2 7 8

  • 5 3 6 4;排序后得到 3 4 5 6

那么就是

竖着看,此时排序得到:1 3 2 4 7 5 8 6

最后gap = 1的时候就是正常的插入排序了。可能有人说,按着增量做,最后一组数据并没有大部分数字有序啊。因为为了讲解选了比较少的数据size=8的数据。如果是size>=100000的话会非常的明显。

3希尔排序的java表达

通过上面的讲解,我们知道。其实希尔排序多了个增量的概念,大体没有变化

首先我们知道增量gap的变化

//不难理解,gap最终变化是4,2,1for (int gap = arr.length / 2; gap > 0; gap /= 2) {}

接下来我们把gap=1时,也就是正常插入排序的代码直接搬进去,如下

for (int gap = arr.length / 2; gap > 0; gap /= 2) {        for (int i = 1; i < arr.length; i++) {            for (int j = i; j > 0; j--) {                if (arr[j] < arr[j - 1]) {                    int temp = arr[j - 1];                    arr[j - 1] = arr[j];                    arr[j] = temp;                }            }        }    }               //上面式子看不大出来,我们把它变一下如下   //看看哪里时候把gap加上   for (int gap = arr.length / 2; gap > 0; gap /= 2) {        for (int i = 1; i < arr.length; i++) {            for (int j = i; j >= 1; j-=1) { //主要是修改了j>0 改成了 j>=1。j-- 改成了 j-=1                if (arr[j] < arr[j - 1]) {                    int temp = arr[j - 1];                    arr[j - 1] = arr[j];                    arr[j] = temp;                }            }        }    }                    //改完之后,我们把gap=1的情况改成gap。也就是把1改成gap变化如下        for (int gap = arr.length / 2; gap > 0; gap /= 2) {            for (int i = gap; i < arr.length; i++) {                for (int j = i; j >= gap; j -= gap) {                    if (arr[j] < arr[j - gap]) {                        int temp = arr[j - gap];                        arr[j - gap] = arr[j];                        arr[j] = temp;                    }                }            }        }    

好了,希尔排序就是这样了!接下来我们打印下,来验证最开始的逻辑:

laravel 先排序后分组怎么写_希尔排序算法拆解解析相关推荐

  1. laravel 先排序后分组怎么写_插入排序的故事

    话说计算机世界有一个诚实国,那里的人们不但诚实,而且尊老,每次排队都让年纪大的人排前面. 有一次小胖到诚实国去旅游,肚子饿了想吃东西,发现一个烧饼店门前有人排着队,他就跟在队伍后面一起排队.没过多久, ...

  2. MySQL下实现先排序后分组查询(问题记录)

    作者:Whiterock_Lelik blog.csdn.net/lglaljj123/article/details/79864188 最近在工作中遇到一个先排序后分组的需求,发现MySql不同的版 ...

  3. 八大排序:冒泡排序、插入排序、希尔排序、选择排序、堆排序、归并排序、快速排序、基数排序

    [前言] 所有代码段都以升序为例,数组下标从0开始.排序的稳定性即:任意两个相等的数据,排序前后的相对位置不发生变化. [冒泡排序(Bubble Sort)] 它重复地访问过要排序的元素序列,依次比较 ...

  4. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  5. 关于js数组的六种算法---水桶排序,冒泡排序,选择排序,快速排序,插入排序,希尔排序的理解。...

    1.水桶排序: 原理:首先找到arr这个数组中的最大项 max(此处为88),然后创建一个新的数组bucket,bucket数组长度为max,然后for循环遍历,在bucket的索引为arr[i]的添 ...

  6. 希尔排序增量怎么确定_Python实现希尔排序(已编程实现)

    希尔排序: 观察一下"插入排序":其实不难发现她有个缺点: 如果当数据是"5, 4, 3, 2, 1"的时候,此时我们将"无序块"中的记录插 ...

  7. 06_排序_希尔排序

    [原理] 1.选择一个步长序列T1,T2,T3...,Tk,满足Ti>Tj(i<j),Tk=1.(步长:即每次插入排序的步长) 2.按步长序列的个数K,对待排序序列进行K趟排序. 3.每趟 ...

  8. python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...

    本文源自微信公众号[Python编程和深度学习]原文链接:经典排序算法和Python详解之(一)选择排序和二元选择排序,欢迎扫码关注鸭! 扫它!扫它!扫它 排序算法是<数据结构与算法>中最 ...

  9. mysql先排序再分组筛选_mysql 怎样先排序再分组

    权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...

最新文章

  1. 怎样才能最短时、高效、踏实地学习3D视觉?
  2. win10商店下载位置_开始菜单终变身但仍不完美!用这些利器让Win10改头换面吧...
  3. hadoop程序开发 --- python
  4. AD 脚本kixtart运用之六(outlook邮件批量生成签名)
  5. linux下面的navicat中文出现白色方块
  6. geotrellis使用(二十九)迁移geotrellis至1.1.1版
  7. Class的getName、getSimpleName与getCanonicalName的区别
  8. hdoj 2041 超级阶梯
  9. 秒懂系列 | 史上最简单的Python Django入门教程
  10. Ragel——基于有限状态机用于产生源码的编译器
  11. 产品设计-产品框架设计
  12. Android 自动点击工具,安卓自动点击器免费版
  13. 【转】SAP 各种记账凭证的更改冲销
  14. xticklabel 显示下划线_[转载]matlab坐标轴属性及标注
  15. 鹏业安装算量软件V8.0.0 Build 60(及58)升级内容
  16. 2020-03-18HTML
  17. MySQL 5.7 服务端 错误码 (机翻)
  18. 2020年浙江理工大学新生赛 C Cly的三角形
  19. LintCode 木材加工
  20. 深度学习模型训练和关键参数调优详解

热门文章

  1. Docker介绍及安装
  2. aria-label
  3. JQuery实现——黑客帝国代码雨效果
  4. javascript常用技巧归纳
  5. Mr.J-- HTTP学习笔记(七)-- 缓存
  6. 华为向全球发布AI数据库、分布式存储,跑分轻松拿世界第一
  7. Django分页器和自定义分页器
  8. js中document.documentElement 和document.body 以及其属性 clientWidth等
  9. HDU 4359 Easy Tree DP? 组合数学+动归
  10. 浅谈云计算三个层次SaaS/PaaS/IaaS