排序函数C++

Sort function C++

本文关键字:C++ 函数 排序      更新时间:2023-10-16

排序函数的问题:void SortAge();调用函数来打印员工姓名:void print(int d),我只收到我推到Stack中的第一个员工的姓名。。。我没有犯任何税务错误感谢

#include <iostream>
#include <cstdio>
using namespace std;
struct employee
{
string name;
int age;
};

class Stack
{
employee employeeList[1000];
int pos =-1;
public:
void push(employee e)
{
    pos++;
    employeeList[pos] = e;

}
employee pop(int n)
{
    employee e;
    if(n<= pos && pos >= 0 && n >=0)
    {
        e= employeeList[pos] ;
        for(int j =n; j < pos; j++ )
        {
            employeeList[pos] = employeeList[pos + 1];
        }
        pos--;
    }
    return e;
}
void print(int d)
{
    if(d > pos || d <0 || pos < 0)
    {
        cout<< "Error";
    }
    cout<<employeeList[d].name<<endl;
}
char menu()
{
    char choice;
    cout << "Press 1. to push an employee"<<endl;
    cout << "Press 2. to pop an employee"<<endl;
    cout << "Press 3. to show an employee"<<endl;
    cout << "Press 4. to sort the list by age"<<endl;
    cin>> choice;
    return choice;

}
void SortAge()
{
    int j;
    for(j = 0;j < pos ; j++)
    {
        if(employeeList[j].age >employeeList[j+1].age)
        {
            employee e;
            e = employeeList[j];
            employeeList[j+1] = employeeList[j];
            employeeList[j] = e;
            j = 0;
        } continue;
    }
}

 };
 int main()
 {
 Stack s;
int j;
for(j=0;j<1000;j++)
{
    char input = s.menu();
    switch(input)
    {
    case '1' :
        {
            employee e;
            cout<<"Enter Name :"<<endl;
            cin>>e.name;
            cout<<"Enter Age :"<<endl;
            cin>>e.age;
            s.push(e);
        }
        break;
        case '2' :
            {
                int n;
                cout<<"Enter at witch position you want to delete employee:"               <<endl;
                cin>>n;
                s.pop(n);
            }
            break;
        case '3' :
            {
                int n;
                cout<<"Enter the position of the employee you want to visualize"<<endl;
                cin>>n;
                s.print(n);
            }
            break;
        case '4' :
            {
                s.SortAge();
            }
            break;
    }
}
return 0;

}

您可以使用冒泡排序。因此,更改排序函数-

    void SortAge()
    {
        int i,j;
        for(i=0; i<=pos ;i++)
        {
            for(j = i+1 ; j <= pos ; j++)
            {
                if(employeeList[i].age >employeeList[j].age)
                {
                    employee e;
                    e = employeeList[j];
                    employeeList[j] = employeeList[i];
                    employeeList[i] = e;
                }
            }
        }
    }

pop()函数中也有一个错误:(

    employee pop(int n)
    {
        employee e;
        if(n<= pos && pos >= 0 && n >=0)
        {
            e= employeeList[pos] ;
            for(int j =n; j < pos; j++ )
            {
                employeeList[j] = employeeList[j + 1];
                // Changed
            }
            pos--;
        }
        return e;
    }

您的排序算法不正确。

除此之外,既然您使用的是C++,为什么不直接使用内置的排序函数呢?

#include <algorithm>
...
void SortAge() {
    std::sort(employeeList, employeeList + pos + 1, [](employee a, employee b){return a.age < b.age});
}

我同意Akash Jain的解决方案。除非对使用内置的排序函数有一些限制,否则您应该为Employee类使用带有自定义比较器(基于谓词)的std::sort。

另外,为什么不使用std::stack呢。这样,您就可以使用内置的pop()方法来删除最顶层的元素。