ヒープソート-ヒープシーケンスを直接読み取る

ヒープソートとは何ですか?

ヒープソートの詳細な説明については、ここを参照してください。ここのわかりやすい
から書かれた
記事は小さなルートヒープであり、一致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
   }

要約すると、アイデアを提供するためだけに...実行速度は、ヒープを再構築するほど速くはありません。

おすすめ

転載: blog.csdn.net/u014147126/article/details/124338980
おすすめ