因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录

本篇内容:

  • 插入排序
  • 希尔排序

(一)插入排序

算法思想:

把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;

排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。

代码实现:

(注意:ArrayBase在第一篇中已给出代码)

/**
*
*/
package com.cherish.SortingAlgorithm; /**
* @author acer
*
*/
public class Chapter_3_插入排序 extends ArrayBase { /**
*
*/
public Chapter_3_插入排序() {
// TODO 自动生成的构造函数存根
} /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] array = new int[] {3,4,7,9,2,5,1,8,6};
printArray(array);
insertSorting(array);
printArray(array);
} /*
* 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;
* 排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。
* */
public static void insertSorting(int[] array) {
// TODO 自动生成的方法存根
int arrayLength = array.length;
for(int i = 1 ; i < arrayLength ; i++)
{
for(int j = i ; j > 0;j--)
{
if(array[j]<array[j-1])
{
swap(array,j,j-1);
} }
printArray(array);
}
}
}

实现结果:

(二)希尔排序

算法思想:

希尔排序的实质就是分组插入排序,又称缩小增量法;

将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,

然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。

因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高

/**
*
*/
package com.cherish.SortingAlgorithm; /**
* @author acer
*
*/
public class Chapter_4_希尔排序 extends ArrayBase { /**
*
*/
public Chapter_4_希尔排序() {
// TODO 自动生成的构造函数存根
} /**
* @param args
*/
public static void main(String[] args) {
int[] array = new int[] {3,4,7,9,2,5,1,8,6};
printArray(array);
shellSorting(array);
printArray(array);
} /*
* 希尔排序的实质就是分组插入排序,又称缩小增量法
* 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,
* 然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。
* 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高
* */
public static void shellSorting(int[] array)
{
int arrayLength = array.length;//数组长度
int gap = arrayLength/2;//子序列数
while(gap>=1)
{
for(int i = gap;i < arrayLength;i++)
{
// int j=i-gap;
for(int j = i-gap;j>=0;j--)
{
if(array[j]>array[i])
{
swap(array,j,i);
}
}
}
gap = gap/2;
printArray(array);
}
}
}

实现结果:

排序算法Java代码实现(三)—— 插入排序 和 希尔排序的更多相关文章

  1. 排序算法Java代码实现(一)—— 选择排序

    以下几篇随笔都是记录的我实现八大排序的代码,主要是贴出代码吧,讲解什么的都没有,主要是为了方便我自己复习,哈哈,如果看不明白,也不要说我坑哦! 本片分为两部分代码: 常用方法封装 排序算法里需要频繁使 ...

  2. 八大排序算法java代码

    1.冒泡排序 public static void main(String[] args) { int[] arr = {1,4,2,9,5,7,6}; System.out.println(&quo ...

  3. 八大排序算法的python实现(二)希尔排序

    代码: #coding:utf-8 #author:徐卜灵 # 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. # 希尔排序,也称递减增量排序算法, ...

  4. 排序算法Java代码实现(四)—— 归并排序

    本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列. 此算法分为两步: ...

  5. 排序算法Java代码实现(六)—— 堆排序

    本片内容: 堆排序 堆排序 最大堆: 二叉堆是完全二叉树或者是近似完全二叉树, 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.(父节点大于任何一个子节点) 算法思想: 把n个元素建立最大 ...

  6. 排序算法Java代码实现(五)—— 快速排序

    本篇内容: 快速排序 快速排序 算法思想: 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对这两部分数据分别进行快速排序, 整个排 ...

  7. 排序算法Java实现(直接插入排序)

    算法描述:对于给定的一个数组,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列 ...

  8. 排序算法Java代码实现(二)—— 冒泡排序

    本篇内容: 冒泡排序 冒泡排序 算法思想: 冒泡排序的原理是:从左到右,相邻元素进行比较. 每次比较一轮,就会找到序列中最大的一个或最小的一个.这个数就会从序列的最右边冒出来. 代码实现: /** * ...

  9. Java实现八种排序算法(代码详细解释)

    经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...

随机推荐

  1. Django ajax 简单介绍

    AJAX Asynchronous Javascript And XML是 "异步Javascript和XML".即使用 Javascript 语言与服务器进行异步交互,传输的数据 ...

  2. python中优雅的杀死线程

    上一篇博客中,杀死线程采用的方法是在线程中抛出异常   https://www.cnblogs.com/lucky-heng/p/11986091.html, 这种方法是强制杀死线程,但是如果线程中涉 ...

  3. 3-14 Pandas绘图

      1.魔法指令:%matplotlib inline :数据画图 In [1]: %matplotlib inline import pandas as pd In [2]: import nump ...

  4. 201871010131-张兴盼 《面向对象程序设计(Java)》第十周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/ ...

  5. (day46)DOM、BOM、事件

    目录 一.BOM (一)定义 (二)window对象 (三)window的子对象 (1)navigator对象 (2)screen对象 (3)history对象 (4)location对象 (5)弹出 ...

  6. AI AND THE BOTTOM LINE: 15 EXAMPLES OF ARTIFICIAL INTELLIGENCE IN FINANCE

    https://builtin.com/artificial-intelligence/ai-finance-banking-applications-companies f there's one ...

  7. coreml之通过URL加载模型

    在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便. 今天说下另外一种通过URL加载 ...

  8. [LeetCode] 327. Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  9. 带有连接池的Http客户端工具类HttpClientUtil

    一.背景 业务开发中,经常会遇到通过http/https向下游服务发送请求.每次都要重复造轮子写HttpClient的逻辑,而且性能.功能参差不齐.这里分享一个高性能的.带连接池的通用Http客户端工 ...

  10. 【转】python中numpy模块下的np.clip()的用法

    转自:https://blog.csdn.net/HHTNAN/article/details/79799612 Numpy 中clip函数的使用 一维数组 其中a是一个数组,后面两个参数分别表示最小 ...