采用事后分析方法后得出结论,shell排序在数据量庞大时比插入排序更为优异,性能更好;但稳定性不行
package day02;
public class Shell {
public static void sort(Comparable[] array){
//1.根据数组array的长度确定增长量h的初始值
int h=1;
while(h<array.length/2){
h=2*h+1;
}
//2.根据h的值进行排序
//h>=1时进行排序
while(h>=1){
//排序
//1.找到待插入元素
for(int i=h;i<array.length;i++){
//2.把待插入元素插入到有序序列中
for(int j=i;j>=h;j-=h){
//3.待插入元素为aaray[j],把array[j-h]和array[j]进行比较
if(greater(array[j-h],array[j])){
//交换元素
exch(array,j,j-h);
}
else{
//待插入元素找到合适位置,结束循环
break;
}
}
}
//减小h的值,h=h/2
h=h/2;
}
}
/*
* 比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
* 数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}