KDF000 2016-02-02
public class ShellSort {
//希尔排序:
//基本思想:
//在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
//然后逐渐将增量减小,重复上述过程。
//直至增量为1,此时数据序列基本有序,最后进行插入排序。
//过程
//平均时间复杂度:O(n^1.5)
public static void main(String[] args) {
int[] arr = new int[]{6,2,4,1,9,3,6,7,0};
System.out.println("排序前=====");
print(arr);
System.out.println("");
System.out.println("排序后=====");
int[] result = shellSort(arr);
print(result);
}
public static int[] shellSort(int[] arr){
int temp = 0;
int incr = arr.length;
while(true){
incr = incr/2;
for(int k=0; k<incr;k++){
for(int i=k+incr; i<arr.length; i+=incr){
for(int j=i; j>k; j-=incr){
if(arr[j]<arr[j-incr]){
temp = arr[j];
arr[j] = arr[j-incr];
arr[j-incr] = temp;
}else{
break;
}
}
}
}
if(incr==1){
break;
}
}
return arr;
}
public static void print(int[] arr){
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]+",");
}
}
}
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。