に私はソートを通じて読んでいるとドナルド・クヌース、第2版でコンピュータプログラミングのアートの3巻でアルゴリズムを検索します。 Knuthは、95ページの「リスト挿入」(従来の挿入ソートの変更)というアルゴリズムを紹介しました。クヌースリストの挿入方法は、C
このページでは、「まっすぐな挿入のための正しいデータ構造は、リンクされた割り当て(セクション2.2.3)は、少数のリンクだけを変更する必要があるため、挿入には理想的です。 "しかし、97ページのMIXALプログラム(プログラムL)は、従来のリンクされた線形リスト構造(アドレスによってリンクされた一連のノード)を利用するようには見えません。代わりに、キーとリンクは構造体のような構造で一緒に格納され、これらの構造体はINPUT
という配列に格納されているようです。
私はリファレンスとして、アルゴリズムのKnuthの説明、およびMIXALアセンブリ言語での彼の実装を提供してきたC.で、このアルゴリズムを実装しようとすることを決めました。私はキーがdata
配列内の要素、それ自身、であるとすることを決めた、と私はlinks
と呼ばれる並列のような配列内のリンクを置きます。 links
配列のサイズがdata
配列のサイズよりも大きいので、私は 'parallel-like array'と言っています。私はlinks
配列の最初の要素として配列を格納することによって、data
配列の最小要素のインデックスを簡単に決定できるように、これを行いました。なぜならlinks
でこの余分なインデックス、インデックス0からlinks
配列のN - (Nは - 1)data
アレイのインデックス1に対応します。 links
配列の各要素は、並べ替えられたリストの次の要素の配列data
のインデックスに対応します。
私の質問は、これは、このアルゴリズムは、彼の説明に基づいて実施されることになっている、または私は何かが足りないのですかあるのですか?
int *listInsertion(int data[], int n) {
if (n > 1) {
int i, j, entry;
int *links = (int *) calloc(n + 1, sizeof *links);
links[n] = -1;
links[n - 1] = n - 1;
for (i = n - 2; i >= 0; i--) {
entry = data[i];
for (j = i + 1; links[j] >= 0 && entry > data[links[j]];
j = links[j] + 1)
continue;
if (j == i + 1) {
links[i] = i;
} else {
links[i] = links[i + 1];
links[i + 1] = links[j];
links[j] = i;
}
}
return links;
}
return NULL;
}
は 'LDA入力、1(KEY)'ことMIXALコードの '09'に並ぶべきではありませんか。 – rcgldr
これを読む他の人にとって、KとLは同じアドレス空間を共有します。 Kは、メモリワードの符号ビットと上位3バイトである(0:3)に格納されます。 Lはメモリワードの下位2バイトである(4:5)に格納されます。 – rcgldr