概念
也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
原则
将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。
算法演练
代码实现(java)
public class ShellSort {
public static void main(String[] args) {
int arr[]={32,24,95,45,75,22,95,49,3,76,56,11,37,58,44,19,81};
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
public static void sort(int arr[]) {
int d=arr.length/2;
int x,j,k=1;
while(d>=1) {
for(int i=d;i<arr.length;i++) {
x=arr[i];
j=i-d;
//直接插入排序,会向前找所适合的位置
while(j>=0 && arr[j]>x) {
//交换位置
arr[j+d]=arr[j];
j=j-d;
}
arr[j+d]=x;
}
d=d/2;
System.out.println("第"+ k++ +"趟:"+Arrays.toString(arr));
}
}
}
排序前:[32, 24, 95, 45, 75, 22, 95, 49, 3, 76, 56, 11, 37, 58, 44, 19, 81]
第1趟:[3, 24, 56, 11, 37, 22, 44, 19, 32, 76, 95, 45, 75, 58, 95, 49, 81]
第2趟:[3, 22, 44, 11, 32, 24, 56, 19, 37, 58, 95, 45, 75, 76, 95, 49, 81]
第3趟:[3, 11, 32, 19, 37, 22, 44, 24, 56, 45, 75, 49, 81, 58, 95, 76, 95]
第4趟:[3, 11, 19, 22, 24, 32, 37, 44, 45, 49, 56, 58, 75, 76, 81, 95, 95]
排序后:[3, 11, 19, 22, 24, 32, 37, 44, 45, 49, 56, 58, 75, 76, 81, 95, 95]