Java 排序算法:希尔排序 详细解析
最开始的增长量h如何确定?规则如下:
int h = 1; while (h < len/2){ //len为待排序数组长度 h = h*2+1; } //循环结束后就得到初始增长量h
举例:对数组 { 4、2、6、3、1、8、7、10、9、5 } 进行希尔排序 图示: 代码实现:
package com.example.algorithmdemo.sortingAlgorithm; /** * 希尔排序 */ public class Shell { public static void sort(Comparable[] a){ int len = a.length; //确定初始增长量 //循环结束得到增长量 int h = 1; while (h < len/2){ h = h*2+1; } //开始排序 //增长量小于1,排序结束 while (h >= 1){ //找到待排序的值 for(int i = h;i < len;i++){ //分组插入排序 for(int j = i;j >= h;j -= h){ if(greater(a[j-h],a[j])){ //若前一个大于后一个则交换 exchange(a,j-h,j); }else{ //找到合适位置,结束循环,开始下一个待排序的值的排序 break; } } } //减少增长量 h = h/2; } } /** * 判断参数a是否比参数b大 * 返回true/false * @param a * @param b * @return */ private static boolean greater(Comparable a,Comparable b){ return a.compareTo(b)>0; } /** * 数组元素i和j交换位置 * @param a * @param i * @param j */ private static void exchange(Comparable[] a,int i,int j){ Comparable temp = a[i]; a[i] = a[j]; a[j] = temp; } }
package com.example.algorithmdemo.test; import com.example.algorithmdemo.sortingAlgorithm.Shell; import java.util.Arrays; public class ShellTest { public static void main(String[] args) { Integer[] a = { 4,2,6,3,1,8,7,10,9,5};//4、2、6、3、1、8、7、10、9、5 Shell.sort(a); System.out.println(Arrays.toString(a)); } }
运行结果: 提示:在处理大批量数据时,希尔排序的性能高于插入排序