【问题标题】:Sorting an array to another array C++将一个数组排序到另一个数组 C++
【发布时间】:2016-05-27 10:24:59
【问题描述】:

我的程序必须对另一个数组中的一个数组进行排序。 当我运行程序时,它会打印 1 2 3 -858993460 5 -858993460 7。 我不明白代码中的错误在哪里。

#include <iostream>
using namespace std;

int main()
{
   const int N = 7;
   int arr[N] = { 3, 17, 2, 9, 1, 5, 7 };

   int max = arr[0];
   for (int i = 1; i < N; i++)
   {
       if (max < arr[i]) 
           max = arr[i];
   }
   int sort_arr[N];
   for (int j = 0; j < N; j++)
   {
       sort_arr[arr[j] - 1] = arr[j];
   }

   for (int i = 0; i < N; i++)
   {
       cout << sort_arr[i] << " ";
   }

   return 0;
}

【问题讨论】:

  • 你到底想用这条线做什么:sort_arr[arr[j] - 1] = arr[j];?
  • J 为1 时,此表达式arr[j] - 1 的计算结果为17-1,这超出了数组arr 的范围
  • sort_arr[arr[j] - 1] 正在超出数组的范围。 (当j1,那么arr[j]17arr[j] - 116...你在哪里对数组进行排序?
  • -858993460 是十六进制 CCCCCCCC,常用于未初始化内存的调试版本。其他 cmets 已经指出这是由于内存访问越界造成的。

标签: c++ arrays sorting copying unordered


【解决方案1】:

好的,让我们面对代码中的问题。

您在那里看到的“奇怪”数字来自未初始化的数组sort_arr。未初始化是什么意思?好吧,sort_arr 在你的记忆中是一个小块。由于程序通常不会清除它的内存,而是声称它使用的内存是空闲的,sort_arr 的块可能包含另一个程序设置的位和字节。出现这些数字是因为这些字节被解释为整数值。所以首先要做的就是在使用数组之前对其进行初始化。

sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 };

现在为什么会出现这些数字?好吧,您可能希望您的算法在sort_arr 中设置所有值,这将产生一个排序数组,对吧?好吧,但是您的算法效果不佳。看到这一行:

sort_arr[arr[j] - 1] = arr[j];

j 为 1 时会发生什么?然后 arr[1] 被评估为 17 和 17 - 1 等于 16。所以 sort_arr[arr[1] - 1]sort_arr[16] 相同,超出了数组的范围。

如果您想自己编写排序算法,我建议您从简单的bubble sort 算法开始。否则,如果您只需要对数组进行排序,请查看 algorithm 标头。使用起来相当简单:

#include <iostream>
#include <algorithm>
#include <iterator> // << include this to use begin() and end()

using namespace std;

int main()
{
    const int N = 7;
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 };

    int sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 };

    copy(begin(arr), end(arr), begin(sort_arr));
    sort(begin(sort_arr), end(sort_arr));

    for (int i = 0; i < N; i++)
    {
        cout << sort_arr[i] << " ";
    }
    cout << endl;
}

顺便说一句。您正在寻找阵列中的最大价值,对吗?对数组进行排序后,sort_arr[N - 1] 是数组中包含的最大值。

【讨论】:

    【解决方案2】:

    如果要将一个数组排序到另一个数组中,那么一种方法是复制该数组,然后使用标准库中的 sort 函数对第二个数组进行排序。

    int arr[10];
    int b[10];
    for(int i=0;i<10;i++) 
    {
        cin>>arr[i];
        b[i]=arr[i];
    }
    sort(b,b+10);
    

    // 此排序函数将按升序对数组元素进行排序,如果您想更改顺序,只需添加一个比较函数作为排序函数的第三个参数。

    【讨论】:

      【解决方案3】:

      您似乎认为sort_arr[arr[j] - 1] = arr[j] 会将arr 排序为sort_arr。不会的。

      这里已经为你编写了排序:http://en.cppreference.com/w/cpp/algorithm/sort你可以这样使用:

      copy(cbegin(arr), cend(arr), begin(sort_arr));
      sort(begin(sort_arr), end(sort_arr));
      

      Live Example

      【讨论】:

        【解决方案4】:

        我的猜测是这是实现一种计数排序的尝试。请注意,在 C++ 或某些版本的 C 中通常不允许使用可变长度数组。您可以使用 _alloca() 从堆栈分配,以获得等效的可变长度数组: int * sort_arr = (int *)_alloca(max * sizeof(int)); .

        #include <iostream>
        using namespace std;
        
        int main()
        {
            const int N = 7;
            // assuming range of values is 1 to ...
            int arr[N] = { 3, 17, 2, 9, 1, 5, 7 };
        
            int max = arr[0];
            for (int i = 1; i < N; i++)
            {
                if (max < arr[i]) 
                    max = arr[i];
            }
            int sort_arr[max];
            for (int i = 0; i < max; i++)
            {
                sort_arr[i] = 0;
            }
            for (int j = 0; j < N; j++)
            {
                sort_arr[arr[j] - 1]++;
            }
        
            for (int i = 0; i < max; i++)
            {
                while(sort_arr[i])
                {
                    cout << i+1 << " ";
                    sort_arr[i]--;
                }
            }
        
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-06
          • 2017-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 2018-11-19
          相关资源
          最近更新 更多