記事ディレクトリ
ヒープソートとは何ですか?
ヒープソートの詳細な説明については、ここを参照してください。ここのわかりやすい
記事は小さなルートヒープであり、一致2
する3
位置と交換する必要があります
ヒープの先頭を交換しないでください。直接読んでください。
ビッグルートヒープの性質(親ノードは常に左右の子ノードよりも大きい)に応じて、毎回ヒープの一番上のノードを取得し(ヒープの再構築と同様)、子ノードを記録できます。 、次に現在の最大値を比較し、上記の手順を繰り返して
コードを直接説明します。
コード
コードの言語
TS
testFunc(){ let arr = [8,1,5,2,15,2,5,89,39,67,9,3,48,4,4,1,0,9,10,11,45] this.buildMaxHeap(arr) let result = this.maxSort(arr) } buildMaxHeap(arr: number[]){ for(let i = Math.floor(arr.length / 2); i >= 0; i--){ this.heapify(arr, i) } } heapify(arr: number[], index: number){ let left = index * 2 + 1 let right = index * 2 + 2 let largest = index if(left < arr.length && arr[left] > arr[largest]){ largest = left } if(right < arr.length && arr[right] > arr[largest]){ largest = right } if(largest != index){ let temp = arr[index] arr[index] = arr[largest] arr[largest] = temp this.heapify(arr, largest) } } //只有这里有差别而已,其他都没差别 maxSort(arr: number[]){ let maxTemp: number[] = [] let result: number[] = [] let curIndex = 0 maxTemp.push(curIndex) while(maxTemp.length > 0){ curIndex = maxTemp.shift() result.push(arr[curIndex]) let left = curIndex * 2 + 1 let right = curIndex * 2 + 2 if(left < arr.length){ maxTemp.push(left) } if(right < arr.length){ maxTemp.push(right) } maxTemp.sort((a, b)=>{ return arr[b] - arr[a] }) } return result }
要約すると、アイデアを提供するためだけに...実行速度は、ヒープを再構築するほど速くはありません。