希爾排序是插入排序的一種,又稱「縮小增量排序」,是插入排序算法的一種更高效的改進版本。
需求
排序前:{9,1,2,5,7,4,8,6,3,5}
排序後:{1,2,3,4,5,5,6,7,8,9}java
1.選定一個增加量h,按照增加量h做爲數據分組的依據,對數據進行分組;
2.對分好組的每一組數據完成插入排序;
3.減少增加量,最小減爲1,重複第二步操做。
增加量h的肯定:增加量h的值每一固定的規則,咱們這裏採用如下規則:算法
int h = 1; while (h < a.length){ h = 2*h+1; } //減少h的值 h=h/2;
import java.util.Arrays; /** * @author: ChengLong * @datetime: 2021/5/23 9:50 */ public class Demo04Shell { public static void main(String[] args) { Integer[] arr = {9,1,2,5,7,4,8,6,3,5}; sort(arr); System.out.println(Arrays.toString(arr)); } /* 1.對數組內的元素進行排序 * */ public static void sort(Comparable[] a) { // 一、根據數組a的長度肯定增加量h的初始值 int h = 1; while (h < a.length){ h = 2*h+1; } // 二、希爾排序 while (h>=1){ //排序 //2.1找到待插入的元素 for (int i = h;i<a.length;i++){ //2.2把待插入的元素插入到有序元素中 for (int j = i;j>=h;j-=h){ //待插入的元素是a[j],比較a[j]和a[j-h] if (greater(a[j-h],a[j])){ //交換元素 exch(a,j-h,j); }else { //待插入元素已經找到了合適的位置,結束循環 break; } } } //減少h的值 h=h/2; } } /*2.:判斷v是否大於w * */ private static boolean greater(Comparable v,Comparable w){ return v.compareTo(w) > 0; } /* 3.交換a數組中,索引i和索引j處的值 * */ private static void exch(Comparable[] a,int i,int j){ Comparable temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } }
在希爾排序中,增加量h並無固定的規則,有不少論文研究了各類不一樣的遞增序列,但都沒法證實某個序列是最
好的,對於希爾排序的時間複雜度分析,已經超出了咱們課程設計的範疇,因此在這裏就不作分析了。數組