(十四)高级排序—希尔排序

一、希尔排序说明:

1. 希尔排序是由于计算机科学家Shell而得名,他在1959年发明了希尔排序算法。希尔排序是基于插入排序,增加了一些新的特性,提高了插入排序的效率。

2. 回顾以往我们的插入排序,会发现,如果一个最小的元素在最右端,进行插入排序时,将他取出放入临时变量,几乎所有的元素都要向右移动一位,效率会非常的低。而希尔排序正好对他进行了改进。

3. 希尔排序的原理是通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能够大跨度的移动,当这些数据项排过一趟序之后,在减小间隔进行第二次排序,依次下去。进行排序时,数据项之间的间隔称为增量,用字母h表示。

二、Java语言描述希尔排序算法:

package com.solid.sort;

public class ShellSort {

//数组

private int[] arr;

//元素个数

private int nElems;

/**

* 构造方法

* @param maxSize

*/

public ShellSort(int maxSize) {

arr = new int[maxSize];

nElems = 0;

}

/**

* 插入元素

* @param key

*/

public void insert(int key) {

arr[nElems++] = key;

}

/**

* 希尔排序

*/

public void shellSort() {

int inner, outer;

int temp;

//找出h的初始值{1, 4, 13, 40, ......}

int h = 1;

while(h <= nElems/3) {

h = h*3 + 1;

}

while(h > 0) {

for(outer=h; outer<nElems; outer++) {

temp = arr[outer];

inner = outer;

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

arr[inner] = arr[inner-h];

inner = inner - h;

}

arr[inner] = temp;

}

h = (h-1) / 3;

}

}

/**

* 打印数组中的所有元素

*/

public void display() {

for(int i=0; i<arr.length; i++) {

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

}

System.out.println();

}

/**

* 测试main方法

* @param args

*/

public static void main(String[] args) {

ShellSort shell = new ShellSort(10);

shell.insert(1);

shell.insert(3);

shell.insert(5);

shell.insert(7);

shell.insert(9);

shell.insert(2);

shell.insert(4);

shell.insert(6);

shell.insert(8);

shell.insert(10);

shell.display();

shell.shellSort();

shell.display();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值