1. 程式人生 > 實用技巧 >希爾排序(ShellSort)

希爾排序(ShellSort)

1.1概述

1959年Shell發明,第一個突破O(n^2)的排序演算法,是簡單插入排序的改進版。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。

1.2描述

  • 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列個數k,對序列進行k 趟排序;
  • 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

1.3程式碼

package shellsort;

import java.util.Arrays;

/**
 * @author xgj
 */
public class ShellSort {
    public static void main(String[] args) {
        int[] res = new int[]{1,2,5,4,6,8,7,9};
        int[] ints = ShellSort.shellSort(res);
        System.out.println(Arrays.toString(ints));
    }

    public static int[] shellSort(int[] arr){
        //inc是增量
        int temp = 0;
        int j = 0;
        //增量預設是長度的一半,每次變為之前的一半,直到最終陣列有序
        for(int inc=arr.length/2 ; inc>=1 ; inc/=2){
            for(int i=inc ; i<arr.length; i++){
                temp = arr[i];
                //將當前的數與減去增量之後位置的數進行比較,如果大於當前數,將他後移
                for(j=i-inc; j>=0;j-=inc){
                    if(arr[j]>temp){
                        arr[j+inc] = arr[j];
                    }else{
                        break;
                    }
                }
                //將當前數放到空出來的位置
                arr[j+inc]=temp;
            }
        }
        return arr;
    }
}

1.4分析

最佳情況:T(n) = O(nlog2 n) 最壞情況:T(n) = O(nlog2 n) 平均情況:T(n) =O(nlog n)