0

コードで選択ソートを使用し、ソート後に配列のインデックスを返そうとしていますが、プログラムで必要な結果が得られません。

int kick=0;
int[] array = new int[10] { 100, 50, 20, 40, 10, 60, 80, 70, 90, 30 };
int[] index = new int[array.Length];

Console.WriteLine("The array before Selection Sort is: ");
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine("array[" + i + "] = " + array[i]);
}

int tmp, min_key;

for (int j = 0; j < array.Length - 1; j++)
{
    min_key = j;
    for (int k = j+1 ; k < array.Length; k++)
    {
        if (array[k] < array[min_key])
        {
            min_key = k;
        }

    }
    int min = min_key;
    index[kick] = min;
    tmp = array[min_key];
    array[min_key] = array[j];
    array[j] = tmp;
    kick = kick + 1;
}

Console.WriteLine("The array index after Selection Sort is: ");
for (int i = 0; i < index.Length; i++)
{
    Console.WriteLine("index[" + i + "] = " + index[i]);        
}
Console.ReadLine();

私が得ている出力は

4
2
9
3
9
5
7
7
8
0

私の質問は、インデックスが繰り返されるのはなぜですか? なぜ9と7が再び来るのですか?二度と欲しくない。

コンソール アプリケーションで私のコードを実行および実行できます。

4

2 に答える 2

1

これが機能しない理由は、インデックスを交換するのではなく、実際のアイテムを交換しているためです。最小のアイテムは、最初はインデックス 4、次にインデックス 2、次にインデックス 9 にあります。この時点で、50 と 30 を入れ替えるので、50 はインデックス 9 になります。次に、インデックス 3 に 40 のアイテムが見つかり、次に50 - 再び、インデックス 9 で。インデックスが繰り返されるのはそのためです。

これを修正するには、アルゴリズムを変更してindex[i] = i範囲全体を初期化してから、アルゴリズムを変更して比較します。

array[index[k]] < array[index[min_key]]

まったく書き込まないでください(つまり、インデックスindexは必要ありません)。kickと を交換する代わりに、array[min_key]array[j]を交換index[min_key]index[j]ます。これで問題は解決するはずです: のすべてのアイテムはarrayそのまま残り、インデックスのみがソートされます。

于 2013-05-09T09:50:58.837 に答える
1

ソートされた値の代わりにインデックスが本当に必要ですか? インデックスが必要な場合は、値で行ったように交換してください。

int kick = 0;
int[] array = new int[10] { 100, 50, 20, 40, 10, 60, 80, 70, 90, 30 };
int[] index = new int[array.Length];

for (int i = 0; i < index.Length; i++)
{
       index[i] = i;
}

Console.WriteLine("The array before Selection Sort is: ");
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine("array[" + i + "] = " + array[i]);
}

int tmp, min_key;

for (int j = 0; j < array.Length; j++)
{
    min_key = j;

    for (int k = j + 1; k < array.Length; k++)
    {
        if (array[k] < array[min_key])
        {
            min_key = k;
        }
    }
    tmp = array[min_key];
    array[min_key] = array[j];
    array[j] = tmp;

    tmp = index[min_key];
    index[min_key] = index[j];
    index[j] = tmp;
 }

  Console.WriteLine("The array index after Selection Sort is: ");
 for (int i = 0; i < index.Length; i++)
 {
     Console.WriteLine("index[" + i + "] = " + index[i] + "(" + array[i] + ")");

 }
 Console.ReadLine();
于 2013-05-09T10:25:41.160 に答える