这是一个工作程序,我一直在尝试从文件字符串和双精度的输入中学习C ++,并将它们放入透视数组中。我所坚持的是在对字符串进行排序时,我想按升序对双打数组进行排序,并将分数与其关联的名称保持一致。在我继续学习如何操纵它们之前,我试图在不使用向量的情况下学习它,这是在任何人问之前不使用向量的原因。 是否最好对2d数组的列进行排序,然后使用1d数组对它们进行排序,或者只是为了拥有一个完成所有操作的语句?对于这个应用程序,最好的排序算法是什么? 到目前为止,我的尝试都失败了所以我转向社区寻求帮助。逻辑很可能是一些我尚未掌握的简单概念。我们都必须从某个地方开始。预先感谢您的帮助。
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void ArraySort (string x[], double y[][3], int length);
int main()
{
ifstream inFile;
inFile.open("bowlers2.txt");
const int SIZE = 10;
int i,j;
double scores[10][3];
string names[SIZE];
string mystring;
if (!inFile)
{
cout << "Can not open the input file"
<< " This program will end."<< "\n";
return 1;
}
for(i = 0; i < SIZE; i++)
{
getline(inFile, names[i]);
for(j = 0; j < 3; j++)
{
getline(inFile, mystring);
scores[i][j] = atoi(mystring.c_str());
}
}
for(int i=0;i<SIZE;i++)
{
cout << names[i] << "\n";
for(j = 0; j < 3; j++)
cout << scores[i][j] << "\n";
}
inFile.close();
ArraySort (names, scores, SIZE);
return 0;
}
void ArraySort (string x[], double y[][3], int LENGTH)
{
int i,j;
string sValue;
double dValue;
for(i = 1; i < LENGTH; i++)
{
sValue = x[i];
for(j = i - 1; j >= 0 && x[j] > sValue; j--)
{
x[j + 1] = x[j];
}
x[j + 1] = sValue;
}
cout << "\n";
for(int i=0;i<LENGTH;i++)
{
cout << x[i] << "\n";
for(j = 0; j < 3; j++)
cout << y[i][j] << "\n";
}
}
程序读取的文件:
Linus too good
100
23
210
Charlie brown
1
2
12
Snoopy
300
300
100
Peperment Patty
223
300
221
Pig Pen
234
123
212
Red Headed Girl
123
222
111
Marcey
1
2
3
keith hallmark
222
300
180
anna hallmark
222
111
211
roxie hallmark
100
100
2
答案 0 :(得分:2)
我认为你要做的是:
void ArraySort (string x[], double y[][3], int LENGTH)
{
int i,j,k;
string sValue;
double dValue;
double dArray[3];
for(i = 1; i < LENGTH; i++)
{
sValue = x[i];
for (k = 0; k < 3; k++)
{
dArray[k] = y[i][k];
}
for(j = i - 1; j >= 0 && x[j] > sValue; j--)
{
x[j + 1] = x[j];
for (k = 0; k < 3; k++)
{
y[j + 1][k] = y[j][k];
}
}
x[j + 1] = sValue;
for (k = 0; k < 3; k++)
{
y[j + 1][k] = dArray[k];
}
}
for(k = 0; k < LENGTH; k++)
for(i = 1; i < 3; i++)
{
dValue = y[k][i];
for(j = i - 1; j >= 0 && y[k][j] > dValue; j--)
{
y[k][j + 1] = y[k][j];
}
y[k][j + 1] = dValue;
}
}
cout << "\n";
for(int i=0;i<LENGTH;i++)
{
cout << x[i] << "\n";
for(j = 0; j < 3; j++)
cout << y[i][j] << "\n";
}
}
答案 1 :(得分:1)
出于学习目的,您可以使用冒泡排序。冒泡排序非常简单,也非常低效和缓慢。在实际应用中,您将使用std::sort
template <typename T>
void bubble_sort(T *num, int num_count)
{
for (int i = 0; i < (num_count - 1); i++)
for (int j = i + 1; j < num_count; j++)
if (num[i] > num[j])
std::swap(num[i], num[j]);
}
void ArraySort(string str[], double num[][3], int str_count)
{
int num_count = 3;
bubble_sort(str, str_count);
for (int i = 0; i < str_count; i++)
bubble_sort(num[i], num_count);
cout << "\n";
for (int i = 0; i < str_count; i++)
{
cout << str[i] << "\n";
for (int j = 0; j < num_count; j++)
cout << num[i][j] << "\n";
}
}