java

位置:IT落伍者 >> java >> 浏览文章

排序算法(Java实现):Shell排序


发布日期:2022年09月28日
 
排序算法(Java实现):Shell排序

希尔排序也称递减增量排序算法是插入排序的一种高速而稳定的改进版本

希尔排序是基于插入排序的以下两点性质而提出改进方法的

插入排序在对几乎已经排好序的数据操作时 效率高 即可以达到线性排序的效率

但插入排序一般来说是低效的 因为插入排序每次只能将数据移动一位

步长的选择是希尔排序的重要部分只要最终步长为任何步长序列都可以工作算法最开始以一定的步长进行排序然后会继续以一定步长进行排序最终算法以步长为进行排序当步长为算法变为插入排序这就保证了数据一定会被排序

一直较好的增量序列是^k^(k)这样可使Shell排序时间复杂度达到O(N^)

为了方便扩展先引入一个抽象的基础类

view plain

package comandyideaalgorithms;

/**

* 排序抽象基础类

* @author AndyChen

*

* @param <T>

*/

public abstract class Sorter<T extends Comparable<T>> {

public abstract void sort(T[] arrayint fromint len);

public final void sort(T[] array){

sort(arrayarraylength);

}

protected final void swap(T[] arrayint fromint to){

T tmp = array[from];

array[from] = array[to];

array[to] = tmp;

}

}

希尔(Shell)排序算法源码如下

view plain

package comandyideaalgorithms;

/**

* 希尔(Shell)排序算法

* @author Administrator

*

* @param <T>

*/

public class ShellSort<T extends Comparable<T>> extends Sorter<T> {

@Override

public void sort(T[] array int from int len) {

int value =;

while((value+)* < len){

value = (value+)* ;

}

for(int delta=value;delta<=;delta=(delta+)/){

for(int i=;i<delta;i++){

invokeInsertionSort(arrayfromlendelta);

}

}

}

private final void invokeInsertionSort(T[] arrayint fromint lenint delta){

if(len<=)

return;

T tmp=null;

for(int i=from+delta;i<from+len;i+=delta)

{

tmp=array[i];

int j=i;

for(;j>from;j=delta)

{

if(pareTo(array[jdelta])<)

{

array[j]=array[jdelta];

}

else break;

}

array[j]=tmp;

}

}

}

               

上一篇:关于使用JAVA单例的问题分析

下一篇:Java Socket重要参数讲解