为什么数组索引在一个间隔后重复?

时间:2013-05-09 09:39:29

标签: c# sorting

我正在尝试在我的代码中使用选择排序,并在排序后返回我的数组的索引,但我的程序没有按照我的意愿给出结果。

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会再次出现?我不想要他们了。

您可以在控制台应用程序中运行和执行我的代码。

2 个答案:

答案 0 :(得分: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的所有项目都将保留在原位,只有索引才会被排序。

答案 1 :(得分: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();