繁体   English   中英

奇偶排序 arrays

[英]Even and odd sorting arrays

我无法让以下程序按升序对“原”、“偶”和“奇”arrays 进行排序。
该代码对我来说似乎很好,但它根本没有正确排序,它将数组分成原始的偶数和奇数列表,但顺序是随机的,根本不是升序。
output 应如下所示:

输入最多 50 个整数。 使用负数停止。
该列表将被分类为奇数和偶数。

Input an integer: 15
Input an integer: 8
Input an integer: 22
Input an integer: 4
Input an integer: 77
Input an integer: 19
Input an integer: 2
Input an integer: -1

 Orig Even Odd 2 2 15 4 4 19 8 8 77 15 22 19 22 77
#include<iostream>
#include<iomanip>
using namespace std;

void DataIn(int Max[], int List[][50]);
void Separate(int Max[], int List[][50]);
int Lowest(int start, int N, int Vector[]);
void Sort(int Max[], int List[][50]);
void DataOut(int Max[], int List[][50]);

int main()
{
    //Index: 0 = input, 1 = even, 2 = odd
    int Max[3] = { 0, 0, 0 };
    int List[3][50];

    cout << "Input up to 50 integers.  Use a negative number to stop.\n";
    cout << "The list will be sorted into odd and even values.\n\n";

    DataIn(Max, List);
    Separate(Max, List);
    Sort(Max, List);
    DataOut(Max, List);
}

void DataIn(int Max[], int List[][50])
{
    cout << "Input an integer: ";
    cin >> List[0][Max[0]];
    while (List[0][Max[0]] > 0)
    {
        cout << "Input an integer: ";
        cin >> List[0][++Max[0]];
    }

    return;
}

void Separate(int Max[], int List[][50])
{
    int n, type;

    for (n = 0; n < Max[0]; ++n)
    {
        if ((List[0][n] % 2) == 0)
            type = 1;
        else
            type = 2;
        List[type][Max[type]++] = List[0][n];
    }

    return;
}

int Lowest(int start, int N, int Vector[])
{
    int i, low = start;
    for (i = start + 1; i < N; i++)
        if (Vector[i] < Vector[low])
            low = i;
    return (low);
}

void Sort(int Max[], int List[][50])
{
    int i, j, k, l;
    double origSort,evenSort,oddSort;
    for (i = 0; i < Max[0] - 1; ++i)
    {
        j = Lowest(i, Max[0], List[50]);
        origSort = List[0][i];
        List[0][i] = List[0][j];
        List[0][j] = origSort;

        k = Lowest(i, Max[1], List[50]);
        evenSort = List[1][i];
        List[1][i] = List[1][k];
        List[1][k] = evenSort;

        l = Lowest(i, Max[2], List[50]);
        oddSort = List[2][i];
        List[2][i] = List[2][l];
        List[2][l] = oddSort;
    }
}

void DataOut(int Max[], int List[][50])
{
    int i;
    int orig = 0, even = 1, odd = 2;
    cout << "\n\n";
    cout << setw(10) << "Orig" << setw(10) << "Even" << setw(10) << "Odd" << "\n\n";
    for (i = 0;i < Max[0];i++)
    {
        if(List[0][i]>0)
            cout << setw(10) << List[orig][i];
        else
            cout << setw(10) << " ";
        if (List[1][i] > 0)
            cout << setw(10) << List[even][i];
        else
            cout << setw(10) << " ";
        if (List[2][i] > 0)
            cout << setw(10) << List[odd][i] << "\n";
        else
            cout << "\n";
        
    }
}

二维数组以及int Max[3]是什么,您都过于复杂了。

事情很简单:对原始向量进行排序,然后过滤奇数和偶数。 由于您在排序后进行过滤,因此两个结果向量将已经排序。

这是 C++20 解决方案:

int main()
{
    using namespace std::ranges::views;

    std::vector<int> v{15, 8, 22, 4, 77, 19, 2};

    std::ranges::sort(v);

    auto evens = v | filter([] (int a) { return a % 2 == 0; });
    auto odds = v | filter([] (int a) { return a % 2 != 0; });

    for (auto e : v)
        std::cout << e << " ";
    std::cout << std::endl;

    for (auto e : evens)
        std::cout << e << " ";
    std::cout << std::endl;

    for (auto e : odds)
        std::cout << e << " ";
    std::cout << std::endl;
}

您甚至不需要变量来存储范围。 如果需要,您可以在 output 循环中进行过滤:

for (auto e : v | filter([] (int a) { return a % 2 == 0; }))
    std::cout << e << " ";
std::cout << std::endl

这是非范围解决方案:

int main()
{
    std::vector<int> v{15, 8, 22, 4, 77, 19, 2};
    std::vector<int> evens;
    std::vector<int> odds;

    std::sort(v.begin(), v.end());

    std::copy_if(v.begin(), v.end(), std::back_inserter(evens),
                 [] (int a) { return a % 2 == 0; });
    std::copy_if(v.begin(), v.end(), std::back_inserter(odds),
                 [] (int a) { return a % 2 != 0; });

    for (auto e : v)
        std::cout << e << " ";
    std::cout << std::endl;

    for (auto e : evens)
        std::cout << e << " ";
    std::cout << std::endl;

    for (auto e : odds)
        std::cout << e << " ";
    std::cout << std::endl;
}

如果您出于某种原因不想使用标准库算法,则至少必须使用标准容器。 放弃 C arrays。 并按照相同的逻辑实现解决方案:排序然后过滤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM