1. 程式人生 > 實用技巧 >【譯】狀態機

【譯】狀態機

1、希爾排序介紹:

  希爾排序是希爾(Donald Shell)於1959年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱為縮小增量排序。

2、 希爾排序基本思想:

  希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止、

3、希爾排序實現示意圖:

4、使用交換法實現希爾排序:

import java.util.Arrays;
public class Test04_希爾排序 {
    public static void
main(String[] args) { int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0}; shellSort(arr); } public static void shellSort(int[] arr) { /** * 最外層迴圈控制步長 * 第二次迴圈控制迴圈次數 */ int count = 0; for (int gap = arr.length / 2; gap > 0; gap /= 2) {
for (int i=gap;i<arr.length;i++){ for (int j=i-gap;j>=0;j-=gap){ if (arr[j] > arr[j+gap]){ int temp = arr[j]; arr[j] = arr[j+gap]; arr[j+gap] = temp; } } } System.out.println(
"第"+(++count)+"次排序結果為:"+ Arrays.toString(arr)); } } //一步一步推導過程 /*public static void shellSort(int[] arr){ *//**第一輪 * 外層迴圈(i=5)是控制輪數,即10個 * 將10個數據分成了:10 / 2 =5(組) for (int i=5;i<arr.length;i++){ for (int j=i-5;j>=0;j-=5){ if (arr[j] > arr[j+5]){ int temp = arr[j]; arr[j] = arr[j+5]; arr[j+5] = temp; } } } System.out.println("第一次排序結果為:"+ Arrays.toString(arr)); *//**//**第二輪 * 5 / 2 =2(組) *//**//* for (int i=2;i<arr.length;i++){ for (int j=i-2;j>=0;j-=2){ if (arr[j] > arr[j+2]){ int temp = arr[j]; arr[j] = arr[j+2]; arr[j+2] = temp; } } } System.out.println("第二次排序結果為:"+ Arrays.toString(arr)); *//**//**第三輪 * 2 / 2 = 1(組) *//**//* for (int i=1;i<arr.length;i++){ for (int j=i-1;j>=0;j-=1){ if (arr[j] > arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } System.out.println("第三次排序結果為:"+ Arrays.toString(arr));*//* }*/ }