排序之希爾排序(JS)


  希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1959年提出而得名。

  希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
  1. 插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率。
  2. 但插入排序一般來說是低效的,因為插入排序每次只能將數據移動一位。

 為更加清晰地說明該排序,貼一張其它地方轉載而來的圖片

 

/*
* 希爾排序 時間復雜度 o(nlog2n).
* 開始時針對無序序列,步長大,交換速度有提升,當數組基本有序的時候,步長少,交換次數少,速度快
*/

//不使用temp,交換數據信息
function swap(arr,i,j){
    arr[i]=arr[i]+arr[j];
    arr[j]=arr[i]-arr[j];
    arr[i]=arr[i]-arr[j];
    return arr;
}

//希爾排序,自組采用直接插入排序 針對有序序列在插入時采用交換法
function shellSort(arr){
    //逐步降低步長直至為1為止
    for(let shellWidth = arr.length/2;shellWidth>0;shellWidth/2){
        //根據步長,將數組進行分組,並使用插入排序法進行交換排序
        //從增量大小的那組數據進行插入排序
        for(let atom =shellWidth ;atom<arr.length ;atom++ ){
            //atom-shellWidth  表示和該元素同組的隔壁相鄰的元素,對於同一組的元素,進行插入排序
            while(atom-shellWidth>0&&arr[atom-shellWidth]>arr[atom]){
                swap(arr,atom-shellWidth,atom);
                atom=atom-shellWidth;
            }
        }
    }        
}

 


免責聲明!

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



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