C ++中动态对象数组中的冒泡排序

Posted

技术标签:

【中文标题】C ++中动态对象数组中的冒泡排序【英文标题】:Bubble sorting in dynamic array of objects in C++ 【发布时间】:2017-12-07 18:19:42 【问题描述】:

我的 City 类包含以下私人数据:城市名称、城市的宽度、长度和高度。我必须制作动态数组,默认情况下由构造函数插入 - City(),当程序启动时。然后程序使用方法 output() 并打印插入的城市数组。

我应该使用冒泡排序来按城市的长度对城市进行排序。完成后,程序应该以越来越长的长度显示已排序的城市。

问题是我的数据是私密的(在公共场合一切都很好,但违反了封装原则!)所以我不能进行冒泡排序。

我尝试做另一个 double double Lengths[n] 类型的动态数组,其内容是第一个数组的长度。然后我进行排序,但程序只打印排序后的长度,这不是我的目标。

我应该打印按长度排序的城市名称。

代码:

class City
private: char *name;
         double width;
         double length;
         double height;
public:void Output();
    City();
    ~City();
    double GetLength()
    
        return length;
    
    double GetWidth() return width; 
    double GetHeight() return height; 
    char GetName() return *name; 

;
City::City()

    char ime[20];
    cout << "Name= ";
    cin >> ime;
    name = new char[strlen(ime) + 1];
    for (int i = 0; i <=strlen(ime); i++)
        name[i] = ime[i];

    cout << "Width= ";
    cin >> width;
    cout << "Length= ";
    cin >> length;
    cout << "Height= ";
    cin >> height;

void City::Output()

    cout << "Name is: " << name << endl;
    cout << " Width is: " << width <<" deg"<< endl;;
    cout << " Length is: " << length << " deg"<<endl;
    cout << " Height is: " << height <<" m"<<endl;
    return;

City::~City()

    cout << " " << endl;
cout << "Destructor of City!" << endl;
delete[] name;


int main()

    //City town;

    //town.Input();
    //town.Output();
    int n;
    City *mA;
    cout << "Input number of cities: " << endl;
    cin >> n;
    mA = new City[n];
    for (int j = 0; j < n; j++)
    
        mA[j].Output();
    
    cout << "Cities from west to east, sorted by their length" << endl;
    double *Lengths = new double[n];
    for (int j = 0; j < n; j++)
    
        Lengths[j] = mA[j].GetLength();

    
int k = 0;//counter
    double max = Lengths[0];
    for (int j = 1; j < n; j++)
    
        if (Lengths[j - 1] >Lengths[j])
        
            max = Lengths[j - 1];
            Lengths[j - 1] = Lengths[j];
            Lengths[j] = max;
        
    


    for (int j = 0; j < n; j++)//cycle for output
    
        mA[j].Output();
    


    delete[]mA;
    return 0;


【问题讨论】:

你违反了规则或0、3、5。添加一个最小的复制构造函数和operator=。 What is The Rule of Three? 的可能重复项 我认为这只是为了尝试将冒泡排序作为一种学习练习。因为,在任何实际程序中,您应该只使用std::sort。 【参考方案1】:

由于我无法对您的回复发表评论,因此我会给您一些建议。第一行:

数组[j]=mA[j].GetName() ;

您有一个随机空间,可能是副本更改并且相对较小,但出于阅读目的这是错误的。

其次,您的命名约定确实是您应该改进的。我应该能够读取一个变量并理解它的含义,但我却很难理解名为 mA 的变量的含义。

第三,你的 else 子句实际上什么也没做。如果这是您的意图,您不会移动阵列的任何部分:

mA[j+1];

您只是针对迭代上方的数组中的元素。我看到您坚持自己的想法,即为冒泡排序制作类似于并行数组的东西,这很好,但您在第一个循环中没有任何动作。

这不是冒泡排序,因为您只是简单地通过每次迭代并检查 Lengths 中的元素的长度是否与 mA 中的元素相等,然后将该元素存储在数组中,但您的 else 语句什么也不做。

您的循环应该类似于这样,但出于某种原因,我将删除字符数组和额外的数组,因为它是不必要的,假设您从对象数组开始:

        if(myObjects[i].GetLength() > myObjects[i+1].GetLength()) //Shortest to longest name or vice versa?
        
             //Store myObject[i] in temp spot
             //myObject[i] = myObject[i+1]
             //myObject[i+1] = temp Storage
        

这将在第一轮为您提供对象的冒泡排序。当然,您必须找出如何在循环中遍历数组以验证所有元素都已正确排序,因为冒泡排序当然需要多次迭代。

【讨论】:

【参考方案2】:

我没有看到直接的问题,但我可以通过你的故事来假设大部分问题。对于如何解决这种情况,您有多种选择。解决此问题的一种简单方法是在对象中创建一个函数,该函数允许您获取对象成员的长度,例如在您的情况下它将是城市名称。

在对象内部创建一个方法,您可以调用该方法来返回私有方法的长度。创建一个调用此方法的循环并并排检查每个元素,直到您无法再对其进行细化。您使用字符而不是字符串作为名称是否有特定原因?

【讨论】:

【参考方案3】:

我不完全确定你在问什么。

但是,据我所知,您的主要问题是您无法排序,因为您试图比较来自两个对象的两个私有变量。

如果将对象放入城市类型的数组中,您可以按长度冒泡排序,但是您需要使用 getter 才能在排序期间引用私有变量。

例如(不准确的语法)

if(cityArray[0].getLength() < cityArray[1].getLength())

 //Do Something

【讨论】:

以上是关于C ++中动态对象数组中的冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

Java - 数组中的冒泡排序对象

C# 使用字符串数组中的嵌套对象动态创建 JSON

请问,C++中的类的对象组成的动态数组怎么用sort()或qsort()排序?

在 C++ 中读取具有动态数组的对象

js 根据对象数组中的属性进行排序

JAVA 数组中的元素是对象,如何给对象排序