希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
下文中的代码增量选择为n/2,每次的增量为上一次的1/2,直到增量为1。
import java.util.Arrays;
public class Solution3 {
public static int[] shellsort(int[] arr) {
int length=arr.length;
for(int step=length/2;step>0;step/=2) {
for(int i=0;i<length;i++) {
for(int j=i+step;j<length;j+=step) {
if(arr[j]<arr[j-step]) {
int sentry=arr[j];//哨兵
int t;
for(t=j;t>=i+step;t-=step) {
if(sentry<arr[t-step]) {
arr[t]=arr[t-step];
}
else
break;
}
arr[t]=sentry;
}
}
}
}
return arr;
}
public static void main(String args[]) {
int a[]= {2,8,5,9,4,4,1,3,7,6,54,23};
System.out.println(Arrays.toString(shellsort(a)));
}
}
希尔排序的时间复杂度与增量的选取有关,不过,总的来说,希尔排序的最终时间复杂度为O(n^2)。