Quicksort 需要帮助来完成这个
Quicksort Need help to finish this
请帮帮我,我需要完成这个程序可以运行,但它不会按年龄排序,它应该根据年龄对记录进行排序,请帮忙。
我无法让它工作
这是我目前所做的。我不知道怎么了
#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]
...
这样的事情
请帮帮我,我需要完成这个程序可以运行,但它不会按年龄排序,它应该根据年龄对记录进行排序,请帮忙。 我无法让它工作
这是我目前所做的。我不知道怎么了
#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]
...