java希尔排序_java_java高级排序之希尔排序,希尔排序对于多达几千个数据 - phpStudy...

java高级排序之希尔排序

希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短

希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过一趟序后,希尔排序算法减小数据项的间隔再进行排序,依此进行下去。进行这些排序时数据项之间的间隔被称为增量,并且习惯上用字母h来表示。

对于某个马上要进行希尔排序的数组,开始的间隔应该更大,然后间隔不段减小,直到间隔变为1.

间隔序列:

间隔序列中的数字素质通常被认为很重要-除了1之外它们没有公约数,这个约束条件使每趟排序更有可能保持前一趟排序已排好的效果,对于不同的间隔序列,有一个绝对的条件,就是逐渐减小的间隔最后一定要等于1.因此最后一趟是一次普通的插入排序。

下面列出的例子是h=h*3+1的规律得出的:

package com.jll.sort;

public class ShellSort {

int[] arr;

int size;

public ShellSort() {

super();

}

public ShellSort(int size) {

this.size = size;

arr = new int[size];

}

/**

* @param args

*/

public static void main(String[] args) {

ShellSort ss = new ShellSort(10);

for(int i=0;i<10;i++){

ss.arr[i] = (int) ((Math.random()*100)+1);

System.out.print(ss.arr[i]+" ");

}

ss.shellSort();

System.out.println();

System.out.println("after sort:");

for(int i=0;i<10;i++){

System.out.print(ss.arr[i]+" ");

}

}

public void shellSort(){

int h = 1;

while(h<=size/3){

h = h*3+1;

}

for(;h>0;h=(h-1)/3){

for(int i=h;i

int temp = arr[i];

int j = i;

while(j>h-1&&arr[j-h]>temp){

arr[j]=arr[j-h];

j-=h;

}

arr[j]=temp;

}

}

}

}相关阅读:

jQuery中is()方法用法实例

jsPDF导出pdf示例

js操作数据库实现注册和登陆的简单实例

C语言的getc()函数和gets()函数的使用对比

JQuery动态添加和删除表格行的方法

Flash Player使用不了Mac查看Flash Player版本号方法

微软官方公布Windows 10 系统和硬件要求

用C/C++来实现 Node.js 的模块(一)

Sql Server 分组统计并合计总数及WITH ROLLUP应用

MFC中Radio Button的用法详解

php判断类是否存在函数class_exists用法分析

Android开发之滑动图片轮播标题焦点

win10正式版部分程序软件显示模糊该怎么办?

JS模拟Dialog弹出浮动框效果代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值