私の仕事は、擬似コードに従ってヒープソートにコードを書き込むことです。入力配列(4 3 2 5 6 7 8 9 12 1
)をヒープソートし、printHeapメソッドでそれを印刷する必要があります。私はprintHeapが動作していることを知っています。これは、すでにbuildHeapというメソッド(最大のヒープバイナリツリーを構築するために使用していますが、あなたはすでにそれを知っています:))と完璧に動作するので、問題はheapSort 。HeapSortに関する問題
正常にソートされ、それが想定される方法(親子1、親2など)で印刷されます。問題は、最大値と最後の値12が突然変わります24私は理由を知りません。
コードは以下の通りです:
void heapSort(int a[], int n){
int x = n+1;
int i;
int temp;
buildMaxHeap(a, n);
for (i = n; i >= 1; i--){
temp = a[i];
a[i] = a [0];
a [0] = temp;
x--;
heapify(a, 0, x);
}
void printHeap(int a[], int n){
int i;
printf("graph g { \n");
for (i = 0; i < n/2; i++){
printf("%d -- %d\n", a[i], a[left(i)]);
if (right(i) < n){
printf("%d -- %d\n", a[i], a[right(i)]);
}
}
printf("}\n");
出力は以下の通りです:
1 2 3 4 5 6 7 8 9 24
graph g {
1 -- 2
1 -- 3
2 -- 4
2 -- 5
3 -- 6
3 -- 7
4 -- 8
4 -- 9
5 -- 24
}
あなたは私が行っている内容を正確に把握ちょうどので、私はここしばらくの.cファイルを添付します: https://onedrive.live.com/redir?resid=8BC629F201D2BC63!26268&authkey=!AFqVlm9AptiZ_xM&ithint=file%2ccを
本当にあなたの助けに感謝します!
乾杯 アリック
あなたが 'heapSort()'関数を使うと、配列に含まれる値のセットが変更されるとは思われませんが、完全なコードは表示されません。質問自体*)。デバッガを使用してこれを整理することをお勧めしますが、私たちの助けを必要とするならば、通常は[mcve]を見たいと思っています。 –
'buildMaxHeap'では、配列' a'にインデックス 'i'を使用しています。その値は' n'と同じくらい高くなる可能性があります。 'a 'に' n'個の値が含まれている場合、 'i'は' n-1'を超えてはなりません。 –
ソースデータを入力すると、カウンター 'n'はゼロから始まり、各番号が入力されるたびに増加します。 10個の数字を入力すると、配列要素0〜9に入力されますが、nは10です。whileループを終了した後に 'n - ;'を追加します。 printArrayループコントロールを 'i <= n;'で修正し、最後にprintHeapループコントロール 'i <(n + 1)/ 2;'を修正します。 – anita2R