[英]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:
它可以按升序或降序排列。
提前致謝。
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.