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]and array[j],交换index[min_key]and 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 回答