希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

1、基本思想

将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。

2、算法描述

①. 选择一个增量序列t1,t2,…, tk ,其中ti > tj,tk = 1;(一般初次取数组半长,之后每次再减半,直到增量为1)

②. 按增量序列个数k,对序列进行k 趟排序;

③. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

3、代码实现

public class ShellSort {

    public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
//int[] array = new int[]{10, 1, 9, 2, 8, 3, 7, 4, 6, 5};
int[] array = new int[100000];
for (int i = 0; i < 100000; i++) {
array[i] = (int) (Math.random() * 100000);
}
shellSort(array);
Long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
} public static void shellSort(int[] array) {
int len = array.length;
int gap = len / 2;
int i, j, tmp;
while (gap >= 1) {
for (i = gap; i < len; i++) {
tmp = array[i];
j = i - gap;
while (j >= 0 && array[j] >= tmp) {
array[j + gap] = array[j];
j = j - gap;
}
j = j + gap;
if (j != i) {
array[j] = tmp;
}
}
//System.out.println(Arrays.toString(array));
gap = gap / 2;
}
}
}

6 Java Shell排序的更多相关文章

  1. java shell排序

    原理图: package suanfa; public class shellInsert { public void shellInsert1(double [] sorted,int inc){ ...

  2. 基本排序算法——shell排序java实现

    shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...

  3. Java常见排序算法之Shell排序

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

  4. Java排序算法(四):Shell排序

    [基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直 ...

  5. java排序算法(八):希尔排序(shell排序)

    java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...

  6. 希尔shell排序——java实现

    希尔排序是对插入排序的优化,将插入排序的交换步长由1增加到h. 希尔排序的思想是使数组中任意间隔为h的元素有序.步长调幅为h = 3*h + 1, 也就是1,4,13,40,121,364, 1003 ...

  7. JAVA实现Shell排序

    Shell排序可以理解为插入排序的变种,它充分利用了插入排序的两个特点: (1). 当数据规模小的时候非常高效. (2). 当给定数据已经有序时的时间代价为O(N) 所以,Shell排序每次把数据分成 ...

  8. Java八大排序之希尔(Shell)排序

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  9. 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现

    排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...

随机推荐

  1. 10 select、poll以及epoll

    IO复用:为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象,为此,咱们来理解下复用在通信领域的使用, 在通信领域中为了充分利用网络连接的物理介质,往往在同一条网络 ...

  2. js判断浏览器内核如果是ie弹出提示非ie不进行任何操作

    如上做一个弹出框针对ie兼容 // 获取IE版本 function IEVersion() { // 取得浏览器的userAgent字符串 var userAgent = navigator.user ...

  3. swift学习网址

    一.网站: 0.swift学习者资源分享 1.swift苹果官网:Swift - Overview 2.Swiftist: Home - Swiftist 社区 3.swift中文指南 4.一起swi ...

  4. ASE19团队项目alpha阶段model组 scrum1 记录

    本次会议于11月1日,19时整在微软北京西二号楼13478召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing Wu, Yu ...

  5. python之字典二 内置方法总结

    Python字典包含了以下内置方法: clear()函数用于删除字典内所有元素 dict1 = {, 'Class': 'First'} print('the start len %d' % len( ...

  6. 保证在浏览器上word/图片/Excel的下载的表现形式一样

    function downloadImage(src) { console.log(src); //src="http://192.168.12.50:8181/file/common/pn ...

  7. dubbo框架-学习-dubbo原理

    博客:Dubbo原理和源码解析之服务暴露 博客:dubbo实现原理简单介绍

  8. zencart设置产品始终免运费sql

    zencart网站后台-Tools(工具)-Install SQL Patches(安装SQL脚本): 运行以下相应sql语句,即可实现产品始终免运费. zencart设置所有产品始终免运费: '; ...

  9. 【经验分享】-PHP程序员的技能图谱

    一.技术知识积累作为参与工作一定年限的程序员,最重要的就是静下心来把遇到的和遗漏的知识点记录下来,做好学习和总结的准备.学习方面,除了看书上网查资料之外,实践也是非常重要的一点,很多不懂的或者不明白的 ...

  10. python+Appium自动化:各种元素定位方法

    name定位 driver.find_element_by_name('飞利浦净水').click() 测试结果报错:selenium.common.exceptions.InvalidSelecto ...