选择排序获取数组的错误索引

时间:2016-02-23 04:42:07

标签: 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];

  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;
  }
}

给出这个数组:

[8.5, 10.0, 9.25, 12.5, 12.75, 12.5, 16.0, 14.75, 17.0, 18.0, 21.0, 13.0, 7.25];

它返回:

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

我似乎无法弄清楚逻辑错误发生的位置。有人可以帮我找到吗?

5 个答案:

答案 0 :(得分:4)

最初使用数字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;
    }   
}

答案 1 :(得分:4)

问题是你不应该交换数组的内容来获得正确的顺序,只是“标记”它(你可以看到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;
  }

答案 2 :(得分:2)

您的算法存在问题。假设最小值位于最后位置。您将最后一个位置存储在数组索引的第一个位置。然后将值与第一个位置的值交换。 所以现在你的最后一个位置很可能包含剩下的最小值。

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

答案 3 :(得分:1)

索引数组存储排序过程中最后一个位置的索引,而不是原始索引。

因此使用原始索引

初始化索引数组
indx[i] = i;

在排序过程中也交换索引

indx[i] = indx[min];
indx[min] = i;

答案 4 :(得分:1)

这是逻辑错误。 每次选择一个元素进行处理,并且它需要从其位置移动时,元素的索引也会改变 例如,在处理索引0处的第一个元素(8.5)之后,它将被移动到索引12处的最小元素的索引,依此类推。 涉及使用&#34;标志的解决方案&#34;看起来合适