排除2d双数组和1d字符串数组的麻烦。

时间:2016-04-18 00:23:30

标签: c++ sorting multidimensional-array

这是一个工作程序,我一直在尝试从文件字符串和双精度的输入中学习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

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";
    }
}