Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么数组索引在一个间隔后重复?_C#_Sorting - Fatal编程技术网

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();