1.shell排序简介
希尔排序按其设计者希尔(Donald Shell)的名字命名,它是一种基于插入排序的快速排序算法,要了解希尔排序,必须先掌握插入排序的原理与实现。
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作(且步长要小于数组长度)。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序
2.shell排序图解
3.代码
public class ShellSort { public static void main(String[] args) { int[] arr = {8,9,1,7,2,3,5,4,6,0}; shellSort1(arr); shellSort2(arr); } /** * 交换法实现shell排序 * @param arr */ public static void shellSort1(int[] arr){ System.out.println("交换法实现shell排序:"); //用于交换 int temp = 0; //确定每组元素的数目,gap为每组元素的数目 for (int gap = arr.length/2;gap>0;gap /= 2){ //对元素进行分组,每组元素个数i<arr.length //i++:第gap个数后面的所有数都要判断是否交换 for (int i=gap;i<arr.length;i++){ //遍历每组的元素,判断其是否交换 for (int j = i-gap;j>=0;j -= gap){ //如果后前面的元素大于后面的元素,则交换 if (arr[j] > arr[j+gap]){ temp = arr[j]; arr[j]=arr[j+gap]; arr[j+gap]=temp; } } } System.out.println(Arrays.toString(arr)); } } /** * 交换法实现shell排序 * @param arr */ public static void shellSort2(int[] arr){ System.out.println("交换法实现shell排序:"); for (int gap = arr.length/2;gap>0;gap /= 2){ for (int i = gap;i<arr.length;i++){ int j = i; int temp = arr[j]; if (arr[j]<arr[j-gap]){ while (j-gap>=0&&temp<arr[j-gap]){ arr[j] = arr[j-gap]; j -= gap; } arr[j]=temp; } } System.out.println(Arrays.toString(arr)); } } }