效率:O(n*logN)

package sort;

import utils.Util;

/**
* 希尔排序
* 以h为间隔,进行比較。 按一定公式。先求出最大的间隔h
* 当h值大时,须要移动的元素个数就少,但移动的距离长。 内部以h步长的元素做插入排序
* 当h减小时。每趟排序须要移动的元素个数增多。但此时已接近于它们排序后的终于位置。这对于插入排序更有效率
*
* @author stone
* @date 2015-7-22 下午4:39:41
*/
public class ShellSort { public static void main(String[] args) { // int[] ary = Util.generateIntArray(10);
int[] ary = {7, 1, 3, 6, 4, 5, 2, 0};
Util.printArray(ary);
sort(ary);
Util.printArray(ary);
} static void sort(int[] ary) {
int h = 1;
while (ary.length/3 > h) {
h = 3 * h + 1;
}
while (h > 0) {
int j, temp;
for (int i = h; i < ary.length; i++) {
temp = ary[i];
// j = i;
// while (j > h - 1 && ary[j - h] >= temp) {
// ary[j] = ary[j - h];
// j -= h;
// }
for (j = i; j > h - 1 && ary[j - h] >= temp; j -= h) {
ary[j] = ary[j - h];
}
ary[j] = temp;
// System.out.println("移动---------");
// Util.printArray(ary);
}
h = (h - 1) / 3;
} }
/*
* [7, 1, 3, 6, 4, 5, 2, 0]
* h=4
* temp = ary[4], i = 4
* 1: [0] 比 [4] [0]>[4] [4]=[0] [0] = temp
* 2: temp=ary[5] [1] 比 [5] 不变
* 3: temp=ary[6] [2] 比 [6] 变化 [6]=[2] [2]=temp
* 4: temp=ary[7] [3] 比 [7] 变化 [7]=[3] [3]=temp
* 如今:
* [4, 1, 2, 0, 7, 5, 3, 6]
*
* [1, 4, 2, 0, 7, 5, 3, 6] 1 移位次数
* [1, 2, 4, 0, 7, 5, 3, 6] 1
* [0, 1, 2, 4, 7, 5, 3, 6] 3
* [0, 1, 2, 4, 7, 5, 3, 6]
* [0, 1, 2, 4, 5, 7, 3, 6] 1
* [0, 1, 2, 3, 4, 5, 7, 6] 3
* [0, 1, 2, 3, 4, 5, 6, 7] 1
*
* 以h为间隔, 按一定公式,先求出最大的间隔h
* while(h>0) {
* for(i=h;i<len;i++) {
* for(循环比較[h]和[i-h]的值,并移位)
* }
* h = 。。 。 最后一轮时 h=1. 这时 i=n i比(i-1),(i-1)再比((i-1)-1) 从后向前相邻两个相比
* }
*/
}

Java 希尔排序的更多相关文章

  1. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  2. Java希尔排序算法

    希尔排序就是对直接插入排序的一个优化.比如有这么一种情况:对一个无序数组进行从小到大的排序,但是数组的最后一个位置的数是最小的,我们要把它挪到第一个位置,其他位置的都要往后移动,要是这个数组非常大,那 ...

  3. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  4. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

  5. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

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

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

  7. Java实现希尔排序

            华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作).         看到了这 ...

  8. 希尔排序java

    希尔排序简述 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率.(希尔排序先将部分数据进行排序,相当于已经部分排好序) ...

  9. 希尔排序----java实现

    思路:希尔排序是分组基础上的直接插入排序,给定的一个步长数组,每个小组先直接插入排序.虽然有四次循环,但是每次循环次数少. package com.sheepmu.text; import java. ...

随机推荐

  1. 调用人人网API

    大致步骤与上篇调用新浪微博API类似.只是感觉新浪微博的做的更好一些,人人网的非常多要手动操作 与新浪微博类似,先在人人网开放平台http://dev.renren.com/注冊站内应用, 把该填的填 ...

  2. Could not execute method of the activity Android

    导致此问题的原因有, 一:未注册 如果是 ActivityNotFoundException 的,那说明没在 Manifest.xml 的 application 标签下注册 activity. 二: ...

  3. Javascript 对象(object)合并

    对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...

  4. TensorFlow的离线安装

    主要通过whl方式进行配置. 1.1          Whl文件下载地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/ 注意:必须安装numpy-mkl, ...

  5. 升级pip后出现 ImportError: cannot import name main

    原文链接   https://blog.csdn.net/accumulate_zhang/article/details/80269313 在Ubuntu中,升级了pip,再次使用pip 安装相关的 ...

  6. PHP Unit资料收集

    ThinkPHP Unit https://github.com/gaoermai/ThinkPHPUnit PHPUnit入门http://blog.csdn.net/fly_heart_yuan/ ...

  7. The "Out of socket memory" error

    The "Out of socket memory" error I recently did some work on some of our frontend machines ...

  8. Windows8.1 关机异常的解决

    昨天电脑无法正常关机,关机后风扇仍然转,硬盘也在读写,等了很长时间都没有完全关机,只能强制关机.以前其他系统也遇到过这个问题,因此考虑还是驱动问题.回想了下之前装过VirtualBox,考虑到应该是V ...

  9. SharePoint自定义程序页面部署 不用重启IIS

    SharePoint的部署方式默认是部署WSP包,尤其是有多个前端的时候WSP包的部署显得非常方便和快捷,但是WSP的部署需要重启整个IIS服务会造成SharePoint站点一段时间不能访问.结合自己 ...

  10. 前端性能优化:配置ETag

    什么是ETag? 实体标签(EntityTag)是唯一标识了一个组件的一个特定版本的字符串,是web服务器用于确认缓存组件的有效性的一种机制,通常可以使用组件的某些属性来构造它. 条件GET请求 浏览 ...