希尔排序算是对简单插入排序的一种改进,属于一种增量式的排序算法。

还不明白希尔排序概念的,先看这个希尔排序介绍

直接放代码

package com.lingaolu;/*** @author 林高禄* @create 2020-05-08-16:28*/
public class ShellSort {public static void main(String[] args) {int[] arr = {5,2,8,99,4,77,83,22,45,25,47,64};sort(arr);println(arr);}// 希尔排序public static void sort(int[] arr){if(null == arr){return;}int length = arr.length;for(int h=length>>1;h>0;h=h>>1){for(int i=h;i<length;i++){for(int j=i;j>h-1;j-=h){if(arr[j]<arr[j-h]){swap(arr,j,j-h);}}}}}public static void swap(int[] arr,int i,int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void println(int[] arr){if(null == arr){System.out.println("数组为空");return;}int length = arr.length;StringBuffer s = new StringBuffer();s.append("[");for(int i=0;i<length;i++){if(i==0){s.append(arr[i]);}else{s.append(",").append(arr[i]);}}s.append("]");System.out.println(s);}}

我们这里的间隔是按集合的长度对半分,但是试验证明效率最高的间隔是

Kunth序列:h = 3*h+1

所以我们把代码改进一下

package com.lingaolu;/*** @author 林高禄* @create 2020-05-08-16:28*/
public class ShellSort {public static void main(String[] args) {int[] arr = {5,2,8,99,4,77,83,22,45,25,47,64};sort(arr);println(arr);}// 希尔排序public static void sort(int[] arr){if(null == arr){return;}int g = 1;int length = arr.length;while(g <= length/3){g = g*3+1;}for(int h=g;h>0;h=(h-1)/3){for(int i=h;i<length;i++){for(int j=i;j>h-1;j-=h){if(arr[j]<arr[j-h]){swap(arr,j,j-h);}}}}}public static void swap(int[] arr,int i,int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void println(int[] arr){if(null == arr){System.out.println("数组为空");return;}int length = arr.length;StringBuffer s = new StringBuffer();s.append("[");for(int i=0;i<length;i++){if(i==0){s.append(arr[i]);}else{s.append(",").append(arr[i]);}}s.append("]");System.out.println(s);}}

希尔排序(详解与代码)相关推荐

  1. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  2. 【Java】插入排序、希尔排序详解

    文章目录 1️⃣必备排序常识 2️⃣插入排序 1.直接插入排序 2.优化后的插入排序 3.折半插入排序 4.性能比较 3️⃣希尔排序 性能比较 1️⃣必备排序常识 稳定性:在原序列中,r[i]=r[j ...

  3. c语言选择排序详解及代码,C语言选择排序算法及实例代码

    选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直 ...

  4. 计数排序 详解 C代码

    1.计数排序作为一个排序算法有以下几个特点: (1)不基于比较 (2)稳定排序 (3)时间复杂度O(n) (4)只能用在数据范围不大的场景(这个问题在举例以后会在讨论) 2.算法思路  (1) 假设有 ...

  5. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  6. c语言排序常用问题,【更新中】【排序详解】解决排序问题(以C语言为例)

    [更新中][排序详解]解决排序问题(以C语言为例) [更新中][排序详解]解决排序问题(以C语言为例) 文章目录 排序的相关概念 简单排序 一.插入排序: (一)插入排序基本思想 (二)插入排序基本操 ...

  7. Sorting 排序详解(c语言实现)

    Sorting 排序详解(c语言实现)# 今日突然有任务,明天补充完整. 邮箱:Is_Dmy@163.com期待交流. Hello,各位小伙伴~我是你们的课代表橙橙,今天呢我要给大家分享的是关于内排序 ...

  8. 十大排序详解(java实现)

    十大排序详解(java实现) 一.十大排序算法概述 1.定义 2.分类 3.比较 4.相关概念 二.各算法原理及实现 1.冒泡排序 2.简单选择排序(Selection Sort) 3.直接插入排序( ...

  9. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

最新文章

  1. 《Android程序设计》一第一部分 工具和基础
  2. bgl 词典_器材屋 篇五十二:“哪里不会点哪里”的后时代——哪里不识扫哪里:科大讯飞扫描词典笔评测_点读机...
  3. ML之FE:基于load_mock_customer数据集(模拟客户)利用featuretools工具实现自动特征生成/特征衍生
  4. 【PAT乙级】1075 链表元素分类 (25 分)
  5. 最牛逼的开源机器学习框架,你知道几个
  6. 多线程中的volatile和伪共享
  7. 杭电oj2047-2049、2051-2053、2056、2058
  8. Membership 数据字典
  9. Eclipse export导出war包报错(Module name is invalid.)
  10. LeetCode 974. 和可被 K 整除的子数组(哈希map)
  11. Arduino笔记-WeMos D1开发环境搭建及亮灯
  12. oracle 清除数据库缓存
  13. linux所有内存监控,流量监控?负载监控?内存监控?IO监控?check_linux_stats全部替你搞定!...
  14. excel 进行二叉树_常见的Excel模型有哪几种?
  15. api sdk开发手册 模板
  16. Flask-SQLAlchemy relationship中的 lazy屬性
  17. 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会
  18. vue时间格式2021-11-21T12:30:00.000+00:00转换yyyy-MM-dd HH:mm:ss
  19. 计算机视觉术语,计算机视觉常用术语中英文对照.doc
  20. Javaweb学生管理系统期末设计

热门文章

  1. 软件测试面试题:什么是断言和验证?
  2. OpenHarmony如何拨打电话
  3. PAT 甲级 A1010 Radix (25 分)
  4. c语言中余数恒等于1,费马小定理_KANGMANG201102_新浪博客
  5. hadoop的两个推荐下载地址
  6. 2019 My excel
  7. 大机构里站队忙——北漂18年(22)
  8. 【原创】机器学习一般流程总结
  9. NanoPi NEO小试牛刀(一)
  10. RZ,NRZ,NRZI