Quicksort需要帮助才能完成此任务

时间:2015-05-18 06:09:07

标签: c++ recursion quicksort

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

这是我到目前为止所做的。我无法弄清楚什么是错的

#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;
}

1 个答案:

答案 0 :(得分:3)

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

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

指向结构数组的某个元素的int成员的指针不是指向所有结构的成员数组的开头的指针(不是&# 39; t存在)。

你有一个选择;重写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] ...

之类的操作