【问题标题】:How to sort C++ array in ASC and DESC mode?如何在 ASC 和 DESC 模式下对 C++ 数组进行排序?
【发布时间】:2011-04-29 19:48:18
【问题描述】:

我有这个数组:

array[0] = 18;
array[1] = -10;
array[2] = 2;
array[3] = 4;
array[4] = 6;
array[5] = -12;
array[6] = -8;
array[7] = -6;
array[8] = 4;
array[9] = 13;

如何在 C++ 中以 asc/desc 模式对数组进行排序?

【问题讨论】:

  • 您每次都分配了相同的阵列位置。数组的最终结果是 1 长度,条目为 13。
  • 您甚至没有填充数组,而是在同一位置反复放置不同的值。
  • @steven_desu 你在说什么?所有兼容的编译器都有 std::sort。如果没有,那么它们就不是 C++ 编译器。
  • @steven:您应该熟悉 C++ 标准库,它确实包含 algorithm 标头和 std::sort() 之类的内容。任何声称可以编译 C++ 的编译器都必须提供它。
  • @cpp_best:可以更简单的方式填充数组:int arr[] = {1,20, -1, 4,5,3 , -15};

标签: c++ arrays sorting


【解决方案1】:

要按升序对数组进行排序,请使用:

#include <algorithm>

int main()
{
   // ...
   std::sort(array, array+n); // where n is the number of elements you want to sort
}

要按降序排序,请使用

#include <algorithm>
#include <functional>  

int main()
{
   // ...
   std::sort(array, array+n, std::greater<int>());
}

【讨论】:

  • @steven_desu: 什么非标准标题?
  • @steven: algorithmfunctional 由国际 C++ 标准定义的标准头文件(参见当前草案中的 17.6.1.2)。手动滚动您自己的排序功能是浪费时间。它很容易出错,并且很可能会产生效率较低的代码。是什么让你认为这是家庭作业?有时人们只是想对数组进行排序并继续他们的生活......
  • 或者一个简单的 lambda 表达式而不是包含一个完整的函数头,这也是高性能的,因为它是内联扩展的。
  • std::greater&lt;&gt;() 也可以工作(没有指定模板参数)
【解决方案2】:

您可以将自定义比较函子传递给std::sort 函数。

【讨论】:

    【解决方案3】:

    首先,我希望您的数组分配在发布时只是一个错误,但您的所有数字都被分配到同一个内存位置。没有什么可排序的。

    之后,您可以使用sort() 函数。链接的示例显示了使用它的简单方法。请注意,没有使用的第三个参数将指定如何比较元素。默认情况下,如果您不指定它使用“小于”的参数,那么您将获得升序排序。更改此项以指定“大于”比较器以获得降序排序。

    【讨论】:

      【解决方案4】:
      #include <iostream>
      #include <stdlib.h>
      using namespace std;
      
      int main (int argc, char *argv[])
          {
              int num[10]={18,-10,2,4,6,-12,-8,-6,13,-1};
              int temp;
      
              cout << "Ascending Sort : \n\n";
      
              for(int i=0; i<=10; i++)
                  {
                      for(int j=i+1; j<=10; j++)
                          {
                              if(num[i]>num[j])
                                  {
                                      temp=num[i];
                                      num[i]=num[j];
                                      num[j]=temp;
                                  }
                          }
                      cout << num[i] << "\n";
                  }
      
              cout << "\nDescending Sort : \n\n";
      
              for(int i=0; i<=10; i++)
                  {
                      for(int j=i+1; j<=10; j++)
                          {
                              if(num[i]<num[j])
                                  {
                                      temp=num[j];
                                      num[j]=num[i];
                                      num[i]=temp;
                                  }
                          }
                      cout << num[i] << "\n";
                  }
      
          return 0;
      }
      

      【讨论】:

      • 这段代码在越界访问数组时被破坏。
      • 将所有 i/j
      【解决方案5】:

      一般情况下,你可以只交换两个变量

      http://www.cplusplus.com/reference/algorithm/sort/

      改变

      bool myfunction (int i,int j) { return (i<j); }
      

      bool myfunction (int i,int j) { return (j<i); }
      

      您可以将其重命名为其他名称,以便在结果需要升序或降序时使用两个比较函数。

      如果函数体表达式复杂,涉及ij多次,那么在参数列表中交换ij而不是每个ij更容易在体内:

      bool myfunction (int j,int i) { return (i<j); }
      

      同样的道理

      http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

      【讨论】:

        猜你喜欢
        • 2019-10-06
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-08-09
        • 2013-02-14
        • 2021-12-13
        • 2015-11-26
        • 1970-01-01
        相关资源
        最近更新 更多