首页 > 解决方案 > C++ 数组排序

问题描述

我必须解决一个问题,该问题包括在 C++ 中对数字列表进行排序。条件是:

  1. 正数,0 必须按升序排序
  2. 负数 - 降序

如果 A = {4,-8,7,-6,0,-7,5} 在最后 B = {0,4,5,7,-6,-7,-8 }

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int i,j,n,A[100],B[100],A_nenegative[100],A_negative[100],aux,m=0,k=0;
    cout<<"max elements"; cin>>n;
    cout<<"elements are"<<endl;
    for(i=0;i<n;i++)
    {
    cin>>A[i];
    }
  for(i=0;i<n;i++)
  for(j=i+1;j<n;j++)
  if(A[i]>A[j])
  {
    aux=A[i];
    A[i]=A[j];
    A[j]=aux;
  }
  for(i = 0; i< n; i++)
    if(A[i]>=0) {
    A_nenegative[i]=A[i];
    B[i]=A_nenegative[i];
    k++;
  }
    for(i=0;i<n;i++)
  for(j=i+1;j<n;j++)
  if(A[i]<A[j])
  {
    aux=A[i];
    A[i]=A[j];
    A[j]=aux;
  }
    for(i=0;i<n;i++)
    if(A[i]<0)
    {
    A_negative[i]=A[i];
    m++;
    }

}

这是我停下来的地方。我对 A_nenegative 中的正数和 A_negative 中的负数进行排序。所以问题是如何先归因于 B - A_nenegative,然后是 A_negative。我在立即对正数进行排序后尝试将其归因于 B ,如下所示:

  for(i = 0; i< n; i++)
    if(A[i]>=0) {
    A_nenegative[i]=A[i];
    B[i]=A_nenegative[i];
    k++;
  }

但我不知道下一步该做什么

标签: c++arrays

解决方案


只需使用谓词。

std::sort(std::begin(a), std::end(a), [](int a, int b) {
        if(a >= 0) {
            if(b >= 0) return a < b;
            else return true;
        }
        else {
            if(b >= 0) return false;
            else return a > b;
        }
    });

如果 a 需要在数组中的 b 之前,谓词返回 true,否则返回 false。
因此,如果 a >= 0 且 b >= 0 --- 我们检查是否 a < b(按升序对非负值进行排序)。
如果 a >= 0 且 b < 0 --- 那么 b 需要在 a 之后,因为所有负值都在非负之后。
如果 a < 0 且 b >= 0 --- 那么 b 需要在 a 之前。
if a < 0 and b < 0 --- 检查是否 a > b(按降序排序)。


推荐阅读