1. 程式人生 > >排序之希爾排序(JS)

排序之希爾排序(JS)

tps 次數 shellSort 轉載 提升 時間復雜度 tar 高效 長大

  希爾排序(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; } } } }

排序之希爾排序(JS)