我正在尝试在我的代码中使用选择排序,并在排序后返回我的数组的索引,但我的程序没有按照我的意愿给出结果。
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会再次出现?我不想要他们了。
您可以在控制台应用程序中运行和执行我的代码。
答案 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();