快速排序的动态大量物体无法正常工作

时间:2018-01-12 14:48:57

标签: c++ arrays class dynamic quicksort

在我的任务中,我必须创建具有数据成员的类city

width(GeografskaShirina)
lenght(GeografskaDaljina)
ime(name)
NadmorskaVisochina(height)

我有defalut的构造函数,它输入数据,复制构造函数和operator =的预定义。

我应该通过GeografskaDaljina(长度)对我的动态阵列保加利亚进行排序,使用快速排序,我在类quicksort的方法中实现了。我还有一个Output()方法(打印城市的排序名称),方法getDaljina(),它返回GeografskaDaljina(长度)。

问题在于,当我在main()中调用quicksort时,排序不能正常工作,并且不会打印出希望的结果。

#include "stdafx.h"
#include<string>
#include<iostream>
using namespace std;
class city {
private:

    string ime;
    double GeografskaShirina;
    double GeografskaDaljina;
    double NadmorskaVisochina;
public:
    city();
    double getDaljina();
    string getN();
    void Output();
    city(const city& p);
    city& operator = (const city& p);
    void quicksort(city bulgaria[], int left, int right);


};

city::city(const city& p)
{
    ime = p.ime;
    GeografskaDaljina = p.GeografskaDaljina;
    GeografskaShirina = p.GeografskaShirina;
    NadmorskaVisochina = p.NadmorskaVisochina;

}
city& city::operator = (const city& p)
{
    if (this != &p)
    {
ime = p.ime;
    GeografskaDaljina = p.GeografskaDaljina;
    GeografskaShirina = p.GeografskaShirina;
    NadmorskaVisochina = p.NadmorskaVisochina;
    }
    return *this;


}
city::city()
{
    cout << "Vavedete ime grad: ";
    cin >> ime;
    cout << "Vavedete geografskata shirina na grada: ";
    cin >> GeografskaShirina;
    cout << "geografskata daljina na grada: ";
    cin >> GeografskaDaljina;
    cout << "Vavedete nadmorska visochina na grada: ";
    cin >> NadmorskaVisochina;
    cout << "---------------------------------" << endl;
}


void city:: quicksort(city bulgaria[], int left, int right)
{
    int  min;
    min = (left + right) / 2;
    cout << left << endl;
    cout << right << endl;
    int i = left;
    int j = right;
    int pivot = bulgaria[min].getDaljina();
    while (left < j || i < right)
    {
        while (bulgaria[i].getDaljina() < pivot)
            i++;
        while (bulgaria[i].getDaljina()>pivot)
            j--;
        if (i <= j)
        {
            city temp = bulgaria[i];
            bulgaria[i] = bulgaria[j];
            bulgaria[j] = temp;
            i++;
            j--;
        }
        else
        {
            if (left < j)
            {
                quicksort(bulgaria, left, j);
            }
            if (i < right)
            {
                quicksort(bulgaria, i, right);
            }
                return;

            }
        }

    return;
    }
    double city::getDaljina() {
    return GeografskaDaljina;
}

string city::getN() {
    return ime;
}
void city::Output()
{
    cout << "Imeto e " << ime << endl;
    cout << "Geografskata shirina e " << GeografskaShirina << endl;
    cout << "Geografskata duljina e " << GeografskaDaljina << endl;
    cout << "Nadmorskata visochina e " << NadmorskaVisochina << endl;
}
int main()
{
    int n;
    int i=0;
    cout << "Broi gradove : ";
    cin >> n;
    cout << endl;
    city *bulgaria = new city[n];
    bulgaria[i].quicksort(bulgaria, 0,n-1);

    for (int i = 0; i < n; i++)
    {
    bulgaria[i].Output();}
    return 0;}

1 个答案:

答案 0 :(得分:0)

您在city :: quicksort中的第二个while循环中使用了错误的索引。您可以使用j将正确的值与数据透视值进行比较:

while (bulgaria[j].getDaljina()>pivot)
        j--;