java算法 -- 希爾排序

java算法 -- 希爾排序

基本思想:先將整個待排序的記錄序列分割成爲若干子序列分別進行直接插入排序,待整個序列
中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。java

  1. 操做方法:
    選擇一個增量序列 t1,t2,…,tk,其中 ti>tj,tk=1;
  2. 按增量序列個數 k,對序列進行 k 趟排序;
  3. 每趟排序,根據對應的增量 ti,將待排序列分割成若干長度爲 m 的子序列,分別對各子表進
    行直接插入排序。僅增量因子爲1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長
    度。
public class HillSortTest {


    public static void main(String[] args) {
        int[] array = {1, 2, 5, 41, 7, 11, 13, 17, 59, 19, 23, 29, 31, 37, 43, 47, 53};
        int[] hillSortArrays = hillSort(array);
        for (int s : hillSortArrays) {
            System.out.print(s + " ");
        }
    }

    /**
     * 希爾排序
     *
     * @param arrays 要排序的數組
     * @return 排序後的數組
     */
    private static int[] hillSort(int[] arrays) {
        int temp;
        //默認步長爲數組長度除以2
        int step = arrays.length;
        do {
            //每次的step都是前一次的一半
            step = step / 2;
            //肯定分組數
            for (int i = 0; i < step; i++) {
                //對分組數據進行直接插入排序
                for (int j = i + step; j < arrays.length; j = j + step) {
                    temp = arrays[j];
                    int k;
                    for (k = j - step; k >= 0; k = k - step) {
                        //step 步數先後數據對比並交換
                        if (arrays[k] > temp) {
                            arrays[k + step] = arrays[k];
                        } else {
                            break;
                        }
                    }
                    arrays[k + step] = temp;
                }
            }
        } while (step != 1);
        return arrays;
    }

}
相關文章
相關標籤/搜索