ヒープソートとは
ヒープ(英語:ヒープ)は、コンピュータサイエンスにおける特殊なタイプのデータ構造の総称です。ヒープは通常、ツリーとして表示できる配列オブジェクトです。ヒープは常に次のプロパティを満たします。
- ヒープ内のノードの値は、常にその親ノードの値以上またはそれ以上です。
- ヒープは常に完全な二分木です。
javascriptでは、配列を使用してこのデータ構造を実装します。
ヒープソートでは、このデータ構造を使用してソートします。
アルゴリズムのアイデア
最大ヒープを構築し、スタックの最上位を使用する
ことは、(スタックの最上位の)値がピンクの領域の値(最後の値)と黄色で交換されるたびに、常に示されているように順序付けられた最大数です。エリア
を作成し、最後に残ったデッドを除外します。下の配列で最大のヒープを再形成します。
そのため、このヒープに対して、ソートプロセス全体を完了するために1つの要素だけが残ります。
アルゴリズムプロセス
- 最初にソート方法を定義します
HeapSort
- 次に、最大ヒープを構築する必要があります
BuildMaxHeap
- 次に、ヒープの性質を維持する方法、つまりヒープメソッドを再形成する方法が必要です。
MaxHeap
- ヒープの上部から配列の最後まで位置を相互に交換してから、形状を変更します
BuildMaxHeap
前提は、図2に示すように、我々は最初の配列をスタックとして、我々はコントロール配列の位置とスタックの位置との関係を知っておく必要がある山を見た後、必要があるということです
、我々は下スタックの使用を開始したMaxHeap
構造の最大のヒープに
MaxHeap
はヒープがあると想定され、ヒープの上部にある左右のノードは最大のヒープの性質と一致しています。
アルゴリズムの実装
/**
* 时间复杂度 平均:O(nlog2n)。
* 空间复杂度:O(1)。
* 稳定性:不稳定
*/
function HeapSort(arr) {
var len = arr.length;
BuildMaxHeap(arr,len);
for (var i = len-1 ; i > 0; i--) {
let box = arr[0];
arr[0] = arr[i];
arr[i] = box;
MaxHeap(arr,0,i);
}
return arr
}
function MaxHeap(arr,i,length) {
var largest = null;
var node = arr[i]; //保存当前节点
var left = i * 2 + 1 ; //定位节点左
var right = i * 2 + 2; //定位节点右
//判断当前有这个节点 (这里会存在当前这个的子节点不存在的情况)处理一下边界情况
if (left < length && node < arr[left]) {
largest = left
}else{
largest = i;
}
if (right < length && arr[largest] < arr[right]) {
largest = right
}
//如果不是i是最大节点 以node作为辅助节点 交换位置
if (largest != i) {
arr[i] = arr[largest];
arr[largest] = node;
MaxHeap(arr,largest,length);
}
}
//建立一个最大堆
function BuildMaxHeap(arr,len){
if(len%2!=0){
len = len +1 ;
}
for(let i = len/2;i>=0;i--){
MaxHeap(arr,i,len)
}
}