java 希爾排序


思路

希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序,同時該算法是沖破O(n2)的第一批算法之一。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。
希爾排序是把記錄按下表的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

時間復雜度

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

代碼

import java.util.Arrays;

/**
 * 希爾排序
 * @author remainsu
 * @version 1.0 2019-06-06
 */
public class ShellSort {

    /**
     * 排序方法
     * @param arr 待排序的數組
     * @return toString 方便輸出
     */
    public static String shellSort(int[] arr) {
        
        //當前正在比較的數字(下方簡稱:“當前”)
        int current;
        //初始增量(此處為:希爾增量)
        int gap = arr.length / 2;
        
        //gap=1的時候,數組已經有序
        while(gap > 0) {
            for(int i=gap; i<arr.length; i++) {
                current = arr[i];
                //與“當前”同組的前一個數字
                int preIndex = i - gap;
                
                //找到同組內比“當前”小的數字
                while(preIndex >= 0 && current < arr[preIndex]) {
                    //在向后移動同組內已排好序的,大於“當前”的數字
                    arr[preIndex + gap] = arr[preIndex];
                    preIndex -= gap;
                }
                //插入“當前”到相應的位置
                arr[preIndex + gap] = current;
            }
            //縮小增量
            gap /= 2;
        }
        
        
        return Arrays.toString(arr);
    }
    
    public static void main(String[] args) {
        
        int[] arr = {111, 3, 5, 52, 74, 312, 75, 3, 764, 3, 2111, 7, 31};
        System.out.println("排序后的數組:"+ shellSort(arr));
    }
}

參考

  1. https://blog.csdn.net/hellozhxy/article/details/79911867


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM