首页 > 解决方案 > 我必须在数组末尾移动负元素,在某些情况下,如下面提供的,我得到的是垃圾谷而不是负元素

问题描述

#include <stdio.h>
#include <iostream>
using namespace std;
#define MAX 10
int main()
{
    //code
    int n,i=0,arr[MAX];
    cin>>n;
    for(int i =0;i<n;i++)
    {
        cin>>arr[i];
    }
    int j=1;
    while(i<n&&j<=n)
    {
        if(arr[i]>0)
        {   
            i++;
            j++;
        }
    else if(arr[i]<0 && arr[j]>0)
    {
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
        i++;
    }
    else if(arr[i]<0 && arr[j]<0)
    {
        j++;
    }
    else 
    {
        i++;
    }
    }
    for(i=0;i<n;i++)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

输入

    4
    -8
    -6
    7
    8

输出

    7 8 4196864 -6

我该如何解决这个问题?

我必须在数组末尾移动负元素,在某些情况下,如下面提供的,我得到的是垃圾值而不是负元素。有些案例正在起作用,但许多案例并不是特别是那些具有两个连续负面元素和以下正面元素的案例。

标签: c++arrays

解决方案


这个答案是为任何使用算法函数寻找 C++ 解决方案的人发布的。完成工作的函数是std::partition

#include <iostream>
#include <algorithm>

#define MAX 10
int main()
{
    int n = 4;
    int arr[MAX] = {-8, -6, 7, 8};
    std::partition(arr, arr + n, [&](int val) { return val >= 0;});
    for (int i = 0; i < n; ++i)
       std::cout << arr[i] << " ";
}

输出:

8 7 -6 -8

如果要保持元素的原始相对顺序,可以使用std::stable_partition

#include <iostream>
#include <algorithm>

#define MAX 10
int main()
{
    int n = 4;
    int arr[MAX] = {-8, -6, 7, 8};
    std::stable_partition(arr, arr + n, [&](int val) { return val >= 0;});
    for (int i = 0; i < n; ++i)
       std::cout << arr[i] << " ";
}

输出:

7 8 -8 -6

推荐阅读