需要帮助来完成这个

Quicksort Need help to finish this

本文关键字:帮助      更新时间:2023-10-16

请帮助我,我需要完成这个程序工作,但它不会按年龄排序,它应该根据年龄排序的记录,请帮助。我不能让它工作

这是我目前所做的。我不知道出了什么问题

#include <cstdlib>
#include <iostream>
using namespace std;
struct contact
{
    char lastname[30];
    char firstname[30];
    int age;
    int cnumber;
}
c[20];
void quickSort(int arr[], int left, int right) {
    int i = left, j = right;
    int tmp;
    int pivot = arr[(left + right) / 2];
    /* partition */
    while (i <= j) {
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };
    /* recursion */
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
        quickSort(arr, i, right);
}
void addContact(int ctr)
{
    cout<<"ADD CONTACT"<<endl;
    cout<<"LAST NAME: "<<endl;
    cin>>c[ctr].lastname;
    cout<<"FIRST NAME: "<<endl;
    cin>>c[ctr].firstname;
    cout<<"AGE: "<<endl;
    cin>>c[ctr].age;
    while (c[ctr].age >= 100 || c[ctr].age <= 0)
    {
        cout<<"Input Age again: ";
        cin>>c[ctr].age;
    }
    cout<<"CONTACT NUMBER: "<<endl;
    cin>>c[ctr].cnumber;
    while (c[ctr].cnumber > 9999999 || c[ctr].cnumber < 1000000)
    {
        cout<<"Input Number Again: ";
        cin>>c[ctr].cnumber;
    }
    system("cls");
}
void display(int a)
{ cout<<"RECORDS"<<endl;
    for(int i=0;i<a;i++)
    {
        cout<<"n";
        cout<<"LAST NAME: ";
        cout<<c[i].lastname<<endl;
        cout<<"FIRST NAME: ";
        cout<<c[i].firstname<<endl;
        cout<<"AGE: ";
        cout<<c[i].age<<endl;
        cout<<"CONTACT NUMBER: ";
        cout<<c[i].cnumber<<endl;
    }
}
int main(int argc, char *argv[])
{
    int choice, loop=0, tmp;
    while (choice!=4)
    {
        cout<<"n";
        cout<<"CHOOSE"<<endl;
        cout<<"1.Add contacts: "<<endl;
        cout<<"2.Display "<<endl;
        cin>>choice;
        switch(choice)
        { case 1:
                addContact(loop);
                loop++;
                break;
            case 2:
                system("cls");
                display(loop);
                break;
            case 3:
                quickSort(&c[loop].age,loop,0);
                display(loop);
                break;
            default:
                cout<<"Invalid";
        }
    }

    return 0;
}

您的quickSort看起来正确,但它对int数组进行排序。你是这样调用它的:

quickSort(&c[loop].age,loop,0);

指向结构体数组中某个元素的int成员的指针是而不是,指向所有结构体中该成员的数组开头的指针(该成员不存在)。

你可以选择;或者重写quickSort来比较contacts,或者给contact一个比较器,使quickSort成为模板函数。

编辑:

重写quickSort来比较contacts非常简单:

void quickSort(contact arr[], int left, int right)
{
  int i = left, j = right;
  contact tmp;
  contact pivot = arr[(left + right) / 2];
  /* partition */
  while (i <= j) {
    while (arr[i].age < pivot.age)
      i++;
    while (arr[j].age > pivot.age)
      j--;
    if (i <= j) {
      tmp = arr[i];
      arr[i] = arr[j];
      arr[j] = tmp;
      i++;
      j--;
    }
  };
if (left < j)
  quickSort(arr, left, j);
if (i < right)
  quickSort(arr, i, right);
}

你所要做的就是确保contact有一个正确工作的赋值运算符,这样你就可以做arr[i] = arr[j]