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,我正在编写一个选择排序,给定一个无序元素数组,它将用排序元素的索引填充一个新数组。比如说, [3, 2, 1] 会回来吗 [2, 1, 0] // original indexes of sorted array [1, 2, 3] 不幸的是,它错误地填充了数组,在一段时间内重复相同的索引 这是我的代码: void sort(float data[], int indx[], int len) { int min; float temp; float tempData[len

我正在编写一个选择排序,给定一个无序元素数组,它将用排序元素的索引填充一个新数组。比如说,

[3, 2, 1]
会回来吗

[2, 1, 0] // original indexes of sorted array [1, 2, 3]
不幸的是,它错误地填充了数组,在一段时间内重复相同的索引

这是我的代码:

void sort(float data[], int indx[], int len) {
  int   min;
  float temp;
  float tempData[len];

  for (int x = 0; x < len; ++x){
    tempData[x] = data[x];
  }

  for (int i = 0; i < len; ++i) {
    min = i;

    for (int j = i + 1; j < len; ++j) {
      if (tempData[j] < tempData[min]) {
        min = j;
      }
    }

    temp = tempData[i];
    tempData[i] = tempData[min];
    tempData[min] = temp;

    indx[i] = min;
  }
}
它返回:

[12, 12, 2, 12, 5, 12, 12, 11, 11, 12, 11, 12, 12]

我似乎不知道逻辑错误发生在哪里。有人能帮我找到它吗?

首先用数字0到len-1填充indx,然后使用索引访问来扫描和操作数组。您当前的代码可能与输入不同步。而且您不需要
tempData

比如说:

void sort(float data[], int indx[], int len) {
    int   min;
    float temp;

    for(int x = 0; x < len; ++x){
        indx[x] = x;
    }   

    for (int i = 0; i < len; ++i) {
        min = i;

        for (int j = i + 1; j < len; ++j) 
        {
            if (data[indx[j]] < data[indx[min]])
            {
                min = j;
            }
        }

        temp = indx[i];
        indx[i] = indx[min];
        indx[min] = temp;
    }   
}
void排序(浮点数据[],int-indx[],int-len){
int-min;
浮子温度;
对于(int x=0;x
您的算法有问题。假设最小值位于最后一个位置。将最后一个位置存储在数组索引的第一个位置。然后将其中的值与第一个位置的值交换。 现在你的最后一个位置可以包含剩余值的最小值

而是使用 {0,1,2,3,4,5,6 ...}
然后根据这些索引处的数据值对该数组进行排序。

问题是,您不应该交换数组的内容以获得正确的顺序,只需“标记”它(您可以看到Hal关于错误解释的回答)。这将产生正确的输出:

  for (int i = 0; i < len; ++i) {

    min = i;

    for (int j = 0; j < len; ++j) {
      if (tempData[j] < tempData[min]) {
        min = j;
      }
    }

    tempData[min]=100000000; //INF, equal to  "don't compare this"

    indx[i] = min;
  }
for(int i=0;i
索引数组存储排序过程中最后一个位置的索引,而不是原始索引

因此,使用原始索引初始化索引数组

indx[i] = i;
在排序过程中也交换索引

indx[i] = indx[min];
indx[min] = i;
这是逻辑错误。 每次选择一个元素进行处理,并且该元素需要从其位置移动时,该元素的索引也会发生变化 例如,在处理索引0处的第一个元素(8.5)后,它将移动到索引12处最小元素的索引,以此类推。
使用“标志”的解决方案似乎是合适的

我很好奇为什么人们会对此投反对票。这是一个定义明确的问题,我想知道到底是什么@AR7您能提供一个代码示例吗?我试图实现你所说的,但我仍然很难让它发挥作用。
indx[i] = indx[min];
indx[min] = i;