簡體   English   中英

如何對 C++ 中的有理數數組進行排序?

[英]How to sort an array of rational numbers in C++?

我想對整數類型的有理數數組進行排序。 我使用了冒泡排序算法。 我將分子與分母相除,然后根據它們的浮點商值比較兩個有理數。 但是,我沒有得到正確的結果。

排序代碼:

void sort(rational arr[], int n) {
    int i, j;
    for (i = 0; i < n-1; i++)
        for (j = 0; j < n-i-1; j++)
            if (arr[j] > arr[j+1])
                swap(arr[j], arr[j+1]);
}

交換代碼:

void swap(rational &r1, rational &r2) {
       rational temp;
       temp.set(r1.getNum(),r1.getDenom());
       r1.set(r2.getNum(),r2.getDenom());
       r2.set(temp.getNum(),temp.getDenom());
}

比較代碼:

int operator>(const rational&r2) const {
        float n1 = (float)this->num/(float)this->denom;
        float n2 = (float)r2.num/(float)r2.denom;

        if(n1>n2) return 1;
        if(n1==n2) return 0;
        if(n1<n2) return -1;
}

主要的

    int main(int argc, char** argv) {

    rational *arr;
    int n = 10;
    cout<<"\You may enter upto 10 relational numbers. How many?"<<endl;
    cin>> n;
    arr = new rational[n];

    fillArray(arr,n);
    cout<<"\nBefore sorting Array contains: "<<endl;
    displayArray(arr,n);
    cout<<"\nAfter sorting Array contains: "<<endl;
    sort(arr,n);
    displayArray(arr,n);
    return 0;
}

當前 output: 在此處輸入圖像描述

預期 Output:

在此處輸入圖像描述

它可以按升序或降序排列。

提前致謝。

operator>方法應該返回boolean而不是 integer。 最好寫成這樣:

bool operator> (const rational &r2) const {
    return (float)num / denom > (float)r2.num / r2.denom;
}

例如,這是一個完整的程序,可以顯示您當前的行為:

#include <iostream>

class rational {
    int num, denom;
public:
    void set(int n, int d) { num = n; denom = d; }
    int getNum() { return num; }
    int getDenom() { return denom; }

    int operator>(const rational &r2) const {
        float n1 = (float)num/(float)denom;
        float n2 = (float)r2.num/(float)r2.denom;

        if(n1>n2) return 1;
        if(n1==n2) return 0;
        if(n1<n2) return -1;
    }

};

void swap(rational &r1, rational &r2) {
    rational temp;
    temp.set(r1.getNum(),r1.getDenom());
    r1.set(r2.getNum(),r2.getDenom());
    r2.set(temp.getNum(),temp.getDenom());
}

void sort(rational arr[], int n) {
    int i, j;
    for (i = 0; i < n-1; i++)
        for (j = 0; j < n-i-1; j++)
            if (arr[j] > arr[j+1])
                swap(arr[j], arr[j+1]);
}

void displayArray(const char *desc, rational *arr, size_t sz) {
    std::cout << desc;
    for (size_t idx = 0; idx < sz; ++idx) {
        std::cout << "  " << arr[idx].getNum() << "/" << arr[idx].getDenom();
    }
    std::cout << '\n';
}

如果你編譯並運行它,你會看到:

Before:  1/3  2/7  -1/4  3/11  5/8  1/2
 After:  1/2  5/8  3/11  -1/4  2/7  1/3

這與您的 output 基本相同。 但是,使用我建議的比較運算符會產生 output:

Before:  1/3  2/7  -1/4  3/11  5/8  1/2
 After:  -1/4  3/11  2/7  1/3  1/2  5/8

這是正確排序的,盡管與您預期的 output 的順序相反。 既然您在問題中說“它可以按升序或降序排列”,我認為這不是問題。


您還應該知道,有理數的范圍和/或精度可能與標准浮點值不同。

如果您必須恢復到浮點數進行比較,我不確定您從一開始就擁有理性會獲得多少收益。

當然,可能只使用浮點數進行排序是可以的,但在其他任何地方都可以使用有理數。 但這是要記住的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM