Java 希尔排序
效率: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 希尔排序的更多相关文章
- java希尔排序
java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...
- Java希尔排序算法
希尔排序就是对直接插入排序的一个优化.比如有这么一种情况:对一个无序数组进行从小到大的排序,但是数组的最后一个位置的数是最小的,我们要把它挪到第一个位置,其他位置的都要往后移动,要是这个数组非常大,那 ...
- Hark的数据结构与算法练习之希尔排序
算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...
- 希尔排序(java)
时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...
- 希尔排序及希尔排序java代码
原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...
- Java实现希尔排序(增量递减排序)
package Insert.sort; import java.util.Scanner; /*又叫缩小增量排序,本质是插入排序,将待排的序列增量分成几个子序列,分别对每个子序列进行直接插入排序 * ...
- Java实现希尔排序
华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这 ...
- 希尔排序java
希尔排序简述 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率.(希尔排序先将部分数据进行排序,相当于已经部分排好序) ...
- 希尔排序----java实现
思路:希尔排序是分组基础上的直接插入排序,给定的一个步长数组,每个小组先直接插入排序.虽然有四次循环,但是每次循环次数少. package com.sheepmu.text; import java. ...
随机推荐
- SharePoint Online 切换经典视图
SharePoint online 默认是现代视图,我们可以通过Powershell命令切换默认视图. 以下,是完成的Powershell命令: # This file uses CSOM. Repl ...
- libjpeg的问题
游戏项目是基于cocos2d-x开发的,但线上发现一个bug就是玩家在设置完自定义头像后直接闪退.凡是在设置该玩家头像的地方,游戏就直接闪退.最终定位到的问题是图片数据源有问题,我的机器是win7,图 ...
- Android scrollbar的设置
insideOverlay:默认值,表示在padding区域内并且覆盖在view上 insideInset:表示在padding区域内并且插入在view后面 outsideOverlay:表示在pad ...
- Calendar获取当天的初始时间,当月的初始时间,当年的初始时间
如下:
- kafka-python的gevent模式和kafka的兼容性
使用gevent会杀死kafka的consumer线程:据查:kafka-python对gevent的支持不是太好,可以使用pykafka:但是可以kafka-python可以结合eventlet使用 ...
- 单一职责原则(Single Responsibility Principle,SRP)
定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的 ...
- 聊聊jdbc statement的fetchSize
在使用MySQL的JDBC时,如果查询结果集过大,使用一次查询,可能会出现Java.lang.OutOfMemoryError: Java heap space问题,因为DB服务器端一次将查询到的结果 ...
- Search Insert Position leetcode java
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- win7系统不能用telnet命令的两种解决方法
电脑专业人员对telnet命令都不陌生了,Telnet当成一种通信协议,在日常工作中,经常面对网络问题的人都会用到telnet命令,因为简单有效,可以帮助更快的找出问题.要是在使用过程中碰到win7纯 ...
- Netty和Tomcat的区别、性能对比
一.Netty和Tomcat有什么区别? Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过 ...