回答:
つまり、ソートされる配列の要素(ヒープ)が追加された追加のデータ構造を使用して、最小値の抽出とソートプロセスを支援します。
いいえ。配列は、O(1)を超える余分なメモリを使用せずに、ヒープ制約に適合するように変換されます。(実際に必要なのは、スワップの目的で配列の1つの要素を保持するのに十分な追加メモリと、ブール値または2つ、ループ変数または2つだけです)。
技術的には、ヒープソートは通常、別個のヒープを使用するものとして説明されるかもしれませんが、その場で実装することは完全に可能です。
配列を使用してツリーのレイアウトを指定できるという基本的な理解が欠けている場合があります。
バイナリツリーがあり、内部ノードが配列のインデックスiにあるとします。次に、そのノードの親と子の配列インデックスは次の方法で見つけることができます。
Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1
見る:
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm
ヒープは完全に配列内に保持および編成できるため、入力配列内で要素を移動することにより、ヒープソートをその場で実行できます。実際、ヒープは元の入力配列を使用して構築および操作されます。
あなたが言うように、ヒープを構築するために特別な構造が本当に必要な場合、ヒープソートは実際にはインプレースソートアルゴリズムではありません。
ただし、そうではありません。並べ替えるのとまったく同じ配列にヒープを構築し、その後ヒープソートアルゴリズムを適用して、その場で並べ替えることができます。
コンピューターサイエンスでは、インプレースアルゴリズム(またはラテン語のin situ)は、少量の一定量の追加ストレージスペースを持つデータ構造を使用して入力を変換するアルゴリズムです。通常、入力は、アルゴリズムの実行時に出力によって上書きされます。インプレースでないアルゴリズムは、インプレースまたはアウトオブプレースと呼ばれることもあります。
スペース要件が無視できる(ビット単位の操作を使用してアイテムをスワップする場合は一定またはまったくない)ため、適切に考慮されます。たとえば、MergeSortは、検索セットの各反復で入力セットが変更されないため、適切ではありません。
インプレースアルゴリズムとアウトオブプレースアルゴリズムの違いを説明する最良の方法は、おそらく、それをインプレースで実行する次のC / C ++文字列反転コードを調べることです(K&Rから)。
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
たとえば、入力文字列を最後から読み取り、文字を別のバッファに配置する場合、アウトオブプレースの文字列反転アルゴリズムになります。