希尔排序的思路是先分组再整合

先对下标进行分组,比如当数组长度为20时,一开始选定一个间隔值为10

对数组进行排序,每隔10个元素比较大小并交换,以下标为间隔,1和11比较、2和12比较......10和20比较

然后间隔值减半,从10到5,(1,6,11,16)比较、(2,7,12,17)比较.....(5,10,15,20)比较

间隔值逐步减半,再从5到2,从2到1,间隔值为1时也就是整个数组的元素进行排序

因为一开始分组交换时,没有顾及到不同组之间元素的前后关系,所以这是一个不稳定的排序算法

代码示例

 1 public class ShellSortDemo {
2 public static void main(String[] args) {
3
4
5
6 int[] arr = new int[20];
7 int[] arr1 = new int[arr.length];
8 for (int i = 0; i < arr.length; i++) {
9 arr[i] = new Random().nextInt() % 1000;
10 arr1[i] = arr[i];
11 }
12 System.out.println(Arrays.toString(arr));
13 shellSort(arr);
14 sort(arr1);
15 System.out.println(Arrays.toString(arr));
16 }
17
18 public static void shellSort(int[] arr){
19
20 /**
21 * 虽然嵌套了三个循环,但是数据的交换次数并不多
22 */
23 int second = 0;
24 for (int gap = arr.length/2; gap >= 1 ; gap/=2) {
25 for (int i = gap; i < arr.length; i++) {
26 int j = i;
27 //分组后,每一组先排序前面的,再排序后面的
28 while (j-gap >= 0 && arr[j] < arr[j-gap]){
29 second++;
30 swap(arr,j,j-gap);
31 j -= gap;
32 }
33 }
34 }
35 System.out.println("希尔排序交换次数:"+second);
36 }
37
38 /**
39 * 基本的冒泡排序
40 */
41 public static void sort(int[] arr){
42 int second = 0;
43 for (int i = 0; i < arr.length - 1; i++) {
44 for (int j = 0; j < arr.length -1; j++) {
45 if(arr[j] > arr[j+1]){
46 swap(arr,j,j+1);
47 second++;
48 }
49 }
50 }
51 System.out.println("冒泡排序交换次数:"+second);
52
53 }
54 public static void swap(int[] arr,int a,int b){
55 int tmp = arr[a];
56 arr[a] = arr[b];
57 arr[b] = tmp;
58 }
59 }

希尔排序代码主要是三个循环和一个判断,虽然写了三个循环,但是比较了一下,数据交换次数比冒泡排序少了很多。

排序算法:Java实现希尔排序的更多相关文章

  1. 排序算法入门之希尔排序(java实现)

    希尔排序是对插入排序的改进.插入排序是前面元素已经有序了,移动元素是一个一个一次往后移动,当插入的元素比前面排好序的所有元素都小时,则需要将前面所有元素都往后移动.希尔排序有了自己的增量,可以理解为插 ...

  2. 八大排序算法之二希尔排序(Shell Sort)

    希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录 ...

  3. 排序算法Java代码实现(三)—— 插入排序 和 希尔排序

    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...

  4. 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...

  5. 八大排序算法Java

    目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择 ...

  6. 6种基础排序算法java源码+图文解析[面试宝典]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...

  7. 十大基础排序算法[java源码+动静双图解析+性能分析]

    一.概述 作为一个合格的程序员,算法是必备技能,特此总结十大基础排序算法.java版源码实现,强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步: ...

  8. python算法介绍:希尔排序

    python作为一种新的语言,在很多功能自然要比Java要好一些,也容易让人接受,而且不管您是成年人还是少儿都可以学习这个语言,今天就为大家来分享一个python算法教程之希尔排序,现在我们就来看看吧 ...

  9. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  10. Java实现希尔排序(增量递减排序)

    package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...

随机推荐

  1. go中如果想要实现别人写的接口,如何保证确实实现了那个接口而不是错过了什么?

    在类型的实现方法上定义通用代码指令 var _ 要实现的接口  = (receiver类型)(nil) 比如要定义一个web处理程序 type  handler_def struct{} var _ ...

  2. python多继承简单方法

    class people(object): #建创一个人类 def __init__(self,name,age): self.name = name self.age = age def eat(s ...

  3. CodeForce-812B Sagheer, the Hausmeister(DFS)

    Sagheer, the Hausmeister CodeForces - 812B 题意:有一栋楼房,里面有很多盏灯没关,为了节约用电小L决定把这些灯都关了. 这楼有 n 层,最左边和最右边有楼梯. ...

  4. Django学习day02随堂笔记

    每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...

  5. PHP中操作数据库的预处理语句

    今天这篇文章的内容其实也是非常基础的内容,不过在现代化的开发中,大家都使用框架,已经很少人会去自己封装或者经常写底层的数据库操作代码了.所以这回我们就来复习一下数据库中相关扩展中的预处理语句内容. 什 ...

  6. Linux系列(20) - shutdown

    作用 用于关机或重启 例子 [shutdown -h 05:30]:设定凌晨05:30关机 [shutdown -h +30]:30分钟后关机 [shutdown -h now] 立即关机 [shut ...

  7. Linux系列(39) - nohup

    nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行. nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的 ...

  8. Oracle基本入门

    一.数据的存储 1.java 程序中的对象:数组.集合保存.当运行的程序结束的时候,里面的数据就消亡. 2.文件存储系统: 存在的缺陷: 2.1)没有明确的数据类型划分. 2.2)没有用户身份验证机制 ...

  9. 关于ModuleNotFoundError: No module named 'xxx' 模块导入失败问题

    我在执行数据库迁移命令的时候pycharm报错,提示ModuleNotFoundError: No module named 'ckeditor',但是我确实是导进来了,而且这个包也从settings ...

  10. 浅聊Linux的五种IO模型

    在日常 Coding 中,多多少少都会接触到网络 IO,就会想要深入了解一下.看了很多文章,总是云里雾里的感觉,直到读了<UNIX网络编程 卷1:套接字联网API>中的介绍后,才豁然开朗. ...