ヒープの並べ替えを学ぶには、最初にヒープの概念を理解する必要があります。完全にバイナリツリーとしてアレイストレージ方法として近似することができます。しかし、彼には他のプロパティがあり、それはバイナリソートツリーに似ています。最大のヒープと最小ヒープの間には違いがあります。ルートノードの値は子ノードの値よりも大きく、最小のヒープはルートノードの値が値よりも小さいことを意味します。その子ノードの。ヒープソートは一般に最大のヒープを使用しますが、最小のヒープは優先キューを構築できます。ヒープのプロパティを維持するために使用されるヒープには、以下のコードのMaxHeapメソッドがありますアレイ、および2番目のパラメーターは、特定のノードの位置を調整することです。実際にヒープに保存されている有効な要素。アレイの長さは、実際にヒープに保存されている要素の数ですが、必ずしも最大ヒープを構築するために必要なすべてのデータではありません。アルゴリズムの紹介では、左のサブノードは0からカウントされるため、左のサブノードは2xi+1になります2は、これらのポイントの子ノードはすべてリーフノードであるため、下から上にソートすることで最大ヒープを構築します。ヒープ内のすべてのノードが最大ヒーププロパティを満たしていることを確認してください。最後に、ヒープソートは、最初のノードを取り出し、残りのノードを再度並べ替えてから、ルートノードを取り出すことです。これにより、私たちがそれを取り出すたびに、それが最大値になることが保証されます。
コードコピーは次のとおりです。
パブリッククラスのheapsort {
private int getLeft(int i){
2*i+1を返します。
}
Private int getRight(int i){
2*i+2を返します。
}
public void maxheap(int [] heap、int loc、int size){
int l = getLeft(loc);
int r = getRight(loc);
int ariggest = loc;
if(l <size && heap [l]> heap [loc]){
最大= l;
}
if(r <size && heap [r]> heap [ragesgest]){
最大= r;
}
if(最大!= loc){
int cache = heap [loc];
heap [loc] = heap [最大];
ヒープ[最大] =キャッシュ;
Maxheap(ヒープ、大、サイズ);
}
}
public void buildheap(int [] heap){
for(int i = heap.length/2; i> = 0; i-){
maxheap(heap、i、heap.length);
}
}
public void sort(int [] heap){
buildheap(heap);
for(int i = heap.length-1; i> 1; i-){
int cache = heap [0];
heap [0] = heap [i];
heap [i] = cache;
Maxheap(Heap、0、I);
}
int cache = heap [0];
heap [0] = heap [1];
ヒープ[1] =キャッシュ;
}
public static void main(string [] args){
int [] heap = new int [] {4,1,5,3,7,12,65,7};
heapsort hs = new Heapsort();
hs.sort(heap);
for(int i = 0; i <heap.length; i ++){
System.out.println(heap [i]);
}
}
}