希尔排序
希尔排序是插入排序的基础上完成的。希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,希尔排序适合于规模中型的数组。多至几千个元素。没有快速排序快,所以对规模大的数据不是最优的选择。但是比冒泡排序、选择排序、插入排序快得多。希尔排序是分组的插入排序。
在数组已经全部有序的情况下,使用希尔排序的效率最高。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次插入排序。因为插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。
优点:快,数据移动少;
缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
//shellSort.java
//shell Sort
public class shellSort {
public static void main(String[] args)
{
int maxSize=100;
ArrayShell arr;
arr=new ArrayShell(maxSize);
arr.insert(77);
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
arr.display();
arr.shellSort();
arr.display();
}
}
class ArrayShell
{
private int[] a;
private int nElems;
//构造函数
public ArrayShell(int max)
{
a=newint[max];
nElems=0;
}
//插入数据
public void insert(int value)
{
a[nElems]=value;
nElems++;
}
//显示数组数据
public void display()
{
for(int j=0;j<nElems;j++)
System.out.println(a[j]+" ");
System.out.println(" ");
}
public void shellSort()
{
int out,temp,in,h;
for(h=nElems/2;h>0;h=h/2)
{
for(int i=h;i<2*h;i=i+1)
{
for(out=i;out<nElems;out=out+h)
{
temp=a[out];
in=out;
while(in>=h&&a[in-h]>=temp)//寻找插入位置
{
a[in]=a[in-h];
in=in-h;
}
a[in]=temp;
}
}
}
}
}
希尔排序分析:
原数组: 77 99 44 55 22 88 11 0 66 33
分组第一次:77 11 0 55 22 88 99 44 66 33
分组第二次:0 11 22 33 66 44 77 55 99 88
分组第三次:0 11 22 33 44 55 66 77 88 99
希尔算法效率分析:
O(NlogN*logN)