C# 为什么数组索引在一个间隔后重复?
我试图在代码中使用选择排序,并在排序后返回数组的索引,但我的程序没有给出我想要的结果C# 为什么数组索引在一个间隔后重复?,c#,sorting,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 < arra
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();
我的问题是为什么指数会重复?
为什么9和7又来了?我不想要他们了
您可以在控制台应用程序中运行和执行我的代码。这不起作用的原因是您正在交换实际的项目,而不是交换索引。最小的项目最初位于索引4,然后位于索引2,然后位于索引9。在这一点上,你交换50和30,所以50最终在索引9。然后在索引3中找到40项,然后在索引9中找到50项。这就是索引重复的原因 要解决此问题,请将整个范围的算法更改为初始化
索引[i]=i
,然后将算法更改为比较
array[index[k]] < array[index[min_key]]
array[index[k]
根本不要写入
索引
(即,您不需要kick
索引)。与交换数组[min\u key]
和数组[j]
不同,交换索引[min\u key]
和索引[j]
。这应该可以解决问题:数组的所有项都将保留在原位,只有索引将被排序。您真的需要索引而不是排序值吗?如果需要索引,只需像交换值一样交换它
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();
int kick=0;
int[]数组=新的int[10]{100,50,20,40,10,60,80,70,90,30};
int[]索引=新的int[array.Length];
for(int i=0;i
您的答案在这里,因为我的for循环将返回数组的索引。我也复制了输出,这是精确的代码,您可以在c#控制台应用程序中复制此代码,然后运行。我是编程新手,所以不知道为什么会发生这种情况,为什么我的结果带有重复值。@I4V这不是OP的答案,是其他人的:)OP显然是在完成一个学习练习(这是一个非常好的练习)之后,而不是在最紧凑的方式之后。@dasblinkenlight我知道,只是想说明关于同一主题的4个问题太多了。谢谢你的帮助,我很困惑。这意味着我不应该交换元素。。只有索引..???@user2345759是的,您应该只交换索引,并使用索引比较元素,如上所述。这是一个非常常见的事情,当被排序的对象太大时,移动它们会很昂贵。是的,我一直在练习。我已经按照你的方式完成了,我只是交换了索引,现在它工作效率很高。谢谢你宝贵的建议。这对我来说是一次很好的学习。你好,谢谢,成功了。我在交换元素。
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();