看一下这两种排序的算法。

  1. 插入排序,其大致实现如下:
    /*** 插入排序;* <pre>*     插入排序(英语:Insertion Sort)是一种简单直观的排序算法。*     它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,*     通常采用in-place排序(即只需用到{\displaystyle O(1)}{\displaystyle O(1)}的额外空间的排序),*     因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。**     ======*     注意:*     1. 这里说的“构建有序序列”,并不是创建一个新的数组或者其他容器,* 而是把当前数组的前面当作一个有序队列,从0 开始,每次给这个有序序列增加一个元素;*     2. 这里的后移是逐步进行的, 判断目标元素,是不是比当前的小,* 如果是,就把当前的元素后移; 然后当前的元素变成了arr[i-1],继续判断和后移;* </pre>** @param array origin*/public static void insertionSort(int[] array) {if (SHOW_INFO) {System.out.printf("insertionSort: before: %s\t size=%d\n", Arrays.toString(array), array.length);}for (int i = 1; i < array.length; ++i) {int val = array[i];int pos = i;// search the target position to insert the waiting value;for (int j = i - 1; j >= 0; --j) {// compare val with array[j] to found the insert positionif (val < array[j]) {array[j + 1] = array[j];pos = j;}}if (pos != i) {array[pos] = val;}if (SHOW_DETAIL) {System.out.printf("each sort in insertionSort: NO.[%d] -> %s | val =%d\n", i, Arrays.toString(array), val);}}if (SHOW_INFO) {System.out.printf("insertionSort: after: %s\t size=%d\n", Arrays.toString(array), array.length);}}

上面的注释写的比较清楚了。这里的插入,是一种很抽象的思考。把一个数组当成两个数组来看,前面的部分当成已经排好序的数组,后面的当成未排序的数组。然后是从前往后的遍历,每次的遍历都会让前面的有序部分长度+1,让无序的部分-1 , 然后注意这里的一个实现细节就是,它并不是先遍历一次找到这次应该插入的位置,然后进行移位和插入,而是在遍历中去比较和移位,这样可以省去一次查找插入位置的遍历。

  1. 然后看一下希尔排序:
    /*** 希尔排序.* 首先是分组,然后在每组中间使用插入插入排序的方式进行排序.* @param array which prepared to sort.*/public static void shellSort(int[] array) {if (SHOW_INFO) {System.out.printf("shell: before: %s\t size=%d\n", Arrays.toString(array), array.length);}for (int gap = array.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < array.length; ++i) {int pos = i;int val = array[i];for (int j = i; j - gap >= 0; j -= gap) {// System.out.println();if (val < array[j - gap]) {pos = j - gap; // change target posarray[j] = array[j - gap];}}if (pos != i) {array[pos] = val;}if (SHOW_DETAIL) {System.out.printf("shell: in sort:[j=%d] %s\t size=%d\n", i - gap, Arrays.toString(array), array.length);}//---}}if (SHOW_INFO) {System.out.printf("shell: after: %s\t size=%d\n", Arrays.toString(array), array.length);}}

希尔排序的思想其实很容易理解,它是通过分组的方式,先分成多个组,然后慢慢合成为一个组。在每个组里面进行插入排序,最后合成为一个组的时候,再进行最后一次的插入排序。这么做是为了,在最后一次的插入排序时,移位的操作能减少。每组中的插入排序实现跟直接插入排序是一致,只是这里的步长不一定是1,可能会大于1;也意味着,你要把这种带有间隔的逻辑上的数组当成一个待排序的数组,然后对这个数组进行排序。

java 插入排序及希尔排序相关推荐

  1. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)...

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  2. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  3. java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序

    好吧 ~~csdn太难用了....尼玛...写了半天的也无法弄进去...lz正在找更好地博客,or放在github上打算.. 下边是lz自己的有道云分享,大概内容是 http://note.youda ...

  4. Java中的插入排序和希尔排序

    插入排序&&希尔排序 插入排序 希尔排序 上一篇博客我给大家伙说了一下子堆排序,之所以我把插入排序和希尔排序放在一起呢,是因为希尔排序实际上用到了插入排序的思想,希望下面的内容能够帮助 ...

  5. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  6. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  7. 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)

    1.排序算法 1.排序的分类 分为内部排序和外部排序,其中内部排序分为插入排序.选择排序.交换排序.归并排序和基数排序.插入排序包括直接插入排序和希尔排序:选择排序包括简单选择排序和堆排序:交换排序包 ...

  8. 插入排序,希尔排序,堆排序

    本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...

  9. 直接插入排序、希尔排序

    直接插入排序.希尔排序 一.直接插入排序 (1)主要思想 (2)代码实现 (3)性能分析 二.希尔排序 (1)主要思想 (2)代码实现 (3)性能分析 一.直接插入排序 直接插入排序类似于我们平时玩扑 ...

最新文章

  1. 如何保证世界杯直播不卡顿?腾讯云要用AI解决这个问题
  2. Python的包管理工具Pip
  3. Java 对象锁和类锁全面解析
  4. UVA - 572 Oil Deposits-dfs找连通块
  5. 【OJ】2020蓝桥杯模拟赛题解(Java语言描述)
  6. https p12证书请求解决问题过程
  7. C++语言基础 —— 控制结构
  8. 【java】java 分支预测 Java处理排序后的数组比没有排序的快
  9. 10g 回收站(RECYCLE BIN)导致查询表空间的利用率时很慢
  10. 基于已有集群动态发现方式部署 Etcd 集群
  11. intersystem-M语言基础语法
  12. visio如何改变折线箭头拐弯方向
  13. 如何用python裁剪图片
  14. Oracle学习3:dual详解
  15. 简单的个人介绍网页-主页面【附代码】
  16. 推荐系统论文 Hierarchical Leaping Networks
  17. 3D激光雷达SLAM算法学习03——前端里程计方案
  18. 分享一些百度收录又快又好的平台,用好它们做推广有奇效!
  19. 学习centos第七天---系统故障处理
  20. Vue子组件中渲染动态组件无效(第一次无效、第二次有效)

热门文章

  1. C语言handle对象对应java,c语言和java语言之间的关系到底是怎么样的,两种 体系?还是一种体系的不同阶段?还是其它的什么?...
  2. 如何在同一台服务器上绑定多个域名?
  3. Flutter配置镜像
  4. 机器学习图像特征提取—颜色(RGB、HSV、Lab)特征提取并绘制直方图
  5. 嵌入式ARM设计编程(一) 简单数据搬移
  6. 容器化技术【Kubernetes】
  7. 文件篮的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 【Shell】测试脚本
  9. DAZ STUDIO 4.12 NVIDIA Iray 渲染设置
  10. windows 沙盒,隔离应用