希爾排序是第乙個時間複雜度突破o(n^2)的高階演算法。顧名思義,這就是被希爾發現的一種排序演算法。演算法本質為分組插入排序。具體實現為:
let count = 0;
function shellsort(arr)
for (gap; gap > 0; gap = math.floor(gap / times))
arr[flag] = temp;}}
return arr;
}let sortarr = ;
for (let i = 0; i < 1000; i ++)
let nativesort = sortarr.concat();
console.time('shell');
console.log(shellsort(sortarr));
console.timeend('shell');
console.time('nativesort');
console.log(nativesort.sort());
console.timeend('nativesort');
console.log(count);
我來解析下上面的**。
let gap = 1, times = 2;
while(gap < arr.length / times)
這一小段**是確認乙個間隙值,times是設定間隙值得倍數。此倍數可以任意設定,不過為2的時候相對表現比較好比較穩定。gap為間隙值,間隙值最後一次一定是1,設定間隙值的目的是為了分割槽比較,例如如果設定為times為2,那麼第一次就是從中間開始左右兩邊比較,左邊放較小值,右邊放較大值,然後依次比較。
for (gap; gap > 0; gap = math.floor(gap / times))
arr[flag] = temp;
}}
這一段**就是分割槽進行比較的插入排序。由於是插入排序,排序的初始區間是有序的,所以可以只找到乙個正確的插入位置就行,後續的一定是滿足規則的,所以這一行j >= 0 && arr[j] > temp可以這樣寫,當然, arr[j] > temp也可以寫在if語句裡面。 對資料結構和演算法的總結和思考(一) 概覽
前段時間陸續看了各種排序演算法和查詢演算法,覺得不過癮,很多東西不系統,所以網上找了一本書程杰的 大話資料結構 這段時間認真學習了全本內容,收穫頗多,想著就總結一下這段時間所學,所思,權當給大家乙個借鑑吧。先從排序演算法說起現在流行的排序演算法如果按型別分大致分為五大類 選擇排序類 插入排序類 交換...
對資料結構和演算法的總結和思考(五) 堆排序
本篇分享的內容為堆排序,提到堆排序就不得不提一下堆這個資料結構。堆實際上是一棵完全二叉樹,因此其任何一非葉節點滿足性質 key i key 2i 1 key i key 2i 2 或者key i key 2i 1 key key 2i 2 即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵...
對資料結構和演算法的總結和思考(七) 二分查詢
說起查詢演算法,二分查詢是肯定不能少的,當然鵝廠有些猿喜歡叫他歐巴馬查詢 二分查詢的時間複雜度為o logn 不線性查詢的時間複雜度o n 更優秀。核心思想 是將n個元素分成大致相等的兩部分,取a n 2 與x做比較,如果x a n 2 則找到x,演算法中止 如果x function binary ...