gpt4 book ai didi

c++ - Quicksort 需要帮助来完成这个

转载 作者:行者123 更新时间:2023-11-28 00:15:58 28 4
gpt4 key购买 nike

请帮助我,我需要完成这个程序可以运行,但它不会按年龄排序,它应该根据年龄对记录进行排序,请帮忙。我无法让它工作

这是我到目前为止所做的。我不知道怎么了

#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]...

关于c++ - Quicksort 需要帮助来完成这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296153/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com