【问题标题】:Sorting an array from Largest to smallest in C++在 C++ 中将数组从最大到最小排序
【发布时间】:2021-11-10 13:41:47
【问题描述】:

我想对一个数组从最大到最小进行排序,并创建一个对其进行排序的新数组...

这是我的代码:

#include <iostream>
using namespace std;
 int main()
 {
   int size, sum = 0, answer = 0,pos, max;
   int array[size];
  int array2[size];
  cin >> size;

   for (int i = 0; i < size; i++)
   {
    cin >> array[i];
    sum+=array[i];
   }

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

    max = 0;
    pos = 0;
    for (int q = 0; q < size; q++)
    {
      if (array[q] > max)
      {
        max = array[q];
        pos = q;
      }
    }
    array2[i] = max;
    array[pos] = 0;
    
   }

   for (int i = 0; i < size; i++)
   {
    cout << array2[i] << ", ";
   }

 return 0;
 }

当我输入时:

5
1 2 3 4 5

我得到的输出是:

0, 0, 0, 0, 5,

但我希望它是 5、4、3、2、1,

【问题讨论】:

  • 您是否尝试调试代码?int size; array[size]; 是严重未定义的行为。
  • 听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide
  • 您正在使用未初始化的size 创建两个数组。这不会有好的结局。
  • int array[size]; -- 即使 size 已初始化,这也不是有效的 C++ 代码。 C++ 中的数组的大小必须由编译时表达式表示,而不是运行时值。请改用std::vector&lt;int&gt; array(size);
  • 所以我猜你不允许使用std::sort

标签: c++ arrays sorting


【解决方案1】:

首先总是在创建变量时初始化它,因为默认情况下它在 C++ 中有一些垃圾值,

此外,您正在尝试分配一个尚未分配任何内容的大小变量(作为数组的大小),这会产生问题,其次,您首先初始化一个数组,然后您从用户那里获取大小变量,即与流程完全相反,要创建具有动态大小的数组,请参阅How Dynamic Array works and is implemented in C++

更新代码:

 #include <iostream>
    using namespace std;
     int main()
     {
       int size=0, sum = 0, answer = 0,pos, max;
      cin >> size;
      int array[size];
      int array2[size];
    
       for (int i = 0; i < size; i++)
       {
        cin >> array[i];
        sum+=array[i];
       }
    
       for (int i = 0; i < size; i++)
       {
    
        max = 0;
        pos = 0;
        for (int q = 0; q < size; q++)
        {
          if (array[q] > max)
          {
            max = array[q];
            pos = q;
          }
        }
        array2[i] = max;
        array[pos] = 0;
        
       }
    
       for (int i = 0; i < size; i++)
       {
        cout << array2[i] << ", ";
       }
    
     return 0;
     }

这是输出

编辑:

根据@PaulMcKenzie 方法,另一种被认为是合适的方法,使用 std::Vector 方法在 C++ 中初始化动态数组,在 Visual Studio 中使用第一种方法的人可能会遇到错误,

第二种方法更新代码:

#include <iostream>
#include <vector>
    using namespace std;
     int main()
     {
       int size=0, sum = 0, answer = 0,pos, max;
      cin >> size;
      std::vector<int> array(size), array2(size);
       for (int i = 0; i < size; i++)
       {
        cin >> array[i];
        sum+=array[i];
       }
    
       for (int i = 0; i < size; i++)
       {
    
        max = 0;
        pos = 0;
        for (int q = 0; q < size; q++)
        {
          if (array[q] > max)
          {
            max = array[q];
            pos = q;
          }
        }
        array2[i] = max;
        array[pos] = 0;
        
       }
    
       for (int i = 0; i < size; i++)
       {
        cout << array2[i] << ", ";
       }
    
     return 0;
     }

第二次输出

【讨论】:

  • @FredLarson 哎呀,我已经更新了答案,谢谢你指出
  • 在链接的网站上绝对没有提到std::vector。很差。
  • @PaulMckenzie 因为这是一个简单的代码,需要一个简单的解决方案也可以工作,如果您认为您有更好的答案,请通过在我们都在这里学习的线程中发布您的答案来启发我们. :)
  • 主要cmets中提到了“解决方案”。只需将伪造的动态数组替换为std::vector&lt;int&gt; array(size), array2(size);#include &lt;vector&gt;。这几乎不是任何值得新答案的变化。请注意,对于遇到您的答案并尝试编译代码的 Visual C++ 用户,您的代码将无法编译。因此,您应该将答案更新为适用于所有 C++ 编译器的内容。
  • 好的,我测试了 Vector 方法,效果很好,我也在答案中添加了这个方法,谢谢你的指点
【解决方案2】:

数组变量的大小必须是编译时常量。运行时用户提供的值在编译时可能不可知。所以我建议使用std::vector 而不是数组。

#include <iostream>
#include<vector>
#include <algorithm>

int main()
{
    
    int size=0, input=0;
    std::cout << "enter size :";
    std::cin >> size;
    std::vector<int> vec;

    for (size_t i{ 0 }; i < size; ++i)
    {
        std::cout << "enter "<<i<< ".input:";
        std::cin >> input;
        vec.push_back(input);
    }

    // Sort the elements of the vector in descending order
    for (const auto& i : vec)
        std::sort(vec.begin(), vec.end(), std::greater <>());

    //Print the elements of the vector
    for (const auto& i : vec)
       std::cout << i << " ,";

    return 0;
}

输出:

enter size :5
enter 0.input:1
enter 1.input:2
enter 2.input:3
enter 3.input:4
enter 4.input:5
5 ,4 ,3 ,2 ,1 ,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2012-04-16
    • 2017-04-16
    • 2017-08-01
    相关资源
    最近更新 更多