我得到了這些只按升序對學生的分數進行排序的方法,但我無法按學生的分數對學生的姓名和 ID 進行排序。
#include <iostream>
using namespace std;
int main()
{
int total;
cin >> total; // How much data you want to input
string ID[100];
string name[100];
int grade[total];
for (int i = 0; i < total; i ) // Inputting the data
{
cin >> ID[i]; // Student ID
cin >> name[i]; // student name
cin >> grade[i]; // student marks
}
for (int i = 0; i < total - 1; i ) {
for (int j = i 1; j < total; j ) {
if (grade[j] < grade[i]) {
int temp = grade[j];
grade[j] = grade[i];
grade[i] = temp;
}
}
}
for (int i = 0; i < total; i ) {
cout << ID[i] << " " << name[i] << " " << grade[i] << endl;
}
return 0;
}
uj5u.com熱心網友回復:
恕我直言,您的代碼根本不是 C 。
- 唯一使用的 C 東西是
cout和cin int grade[total];像C 中不存在的可變長度陣列,僅在 C 中存在。
如果您撰寫了一個學生類,它以無法單獨處理的方式結合了 ID、姓名和成績,那么您將始終將完整的學生與其姓名和 ID 交換。然后你甚至可以使用像 std::sort 這樣的 C 演算法。
這就是它的樣子。但是你仍然可以撰寫自己的冒泡排序演算法。
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Student
{
public:
string ID{};
string name{};
int grade{};
};
int main() {
int total;
cin >> total; //How much data you want to input
vector<Student> pupils(total);
for (auto& student : pupils) //Inputting the data
{
cin >> student.ID; //Student ID
cin >> student.name; //student name
cin >> student.grade; //student marks
}
std::sort(pupils.begin(), pupils.end(),
[](Student const& a, Student const& b) {return a.grade < b.grade; }
);
for (auto const& student : pupils)
{
cout << student.ID << " " << student.name << " " << student.grade << endl;
}
return 0;
}
一些備注:
- 請注意命名如何使一些注釋變得多余,因此它們現在可以被洗掉。
- 請閱讀為什么是“使用命名空間標準;” 被認為是不好的做法?
- 您的代碼根本沒有用戶提示。輸入資料是相當困難的,即使對我知道該怎么做也是如此。
uj5u.com熱心網友回復:
正如我的評論所提到的,另一種選擇是不對陣列本身進行排序,而是對索引陣列進行排序。
這使您可以將陣列分開,如果您有要處理的陣列,則無需撰寫n“交換代碼”集。n
以下主要是您的代碼,但已應用上述內容:
#include <iostream>
#include <string>
int main()
{
int total;
std::cin >> total;
std::string ID[100];
std::string name[100];
int grade[100];
int index[100];
for (int i = 0; i < total && i < 100; i ) //Inputting the data
{
std::cin >> ID[i]; //Student ID
std::cin >> name[i]; //student name
std::cin >> grade[i]; //student marks
index[i] = i; // must be set up (0, 1, 2, 3, ..., total-1)
}
for (int i = 0; i < total-1; i )
{
for (int j = i 1; j < total; j )
{
// If necessary, swap index[i] and index[j] if the
// grades at those locations are out of order
if (grade[index[j]] < grade[index[i]])
{
int temp = index[j];
index[j] = index[i];
index[i] = temp;
}
}
}
// Output the sorted data using the index array
for (int i = 0; i < total; i ) {
std::cout << ID[index[i]] << " " << name[index[i]] << " " << grade[index[i]] << std::endl;
}
// For reference, output the final index array.
std::cout << "\nIndex Array:\n";
for (int i = 0; i < total; i ) {
std::cout << index[i] << " ";
}
}
輸入:
4
1 Joe 50
2 Jack 40
3 Mary 80
4 Sam 75
輸出:
2 Jack 40
1 Joe 50
4 Sam 75
3 Mary 80
Index Array:
1 0 3 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514790.html
標籤:C 排序冒泡排序
