对2D动态数组C ++进行排序

时间:2016-02-02 06:37:41

标签: c++ arrays sorting

当第1行用于产品ID而第2行用于产品价格时,我正在尝试对二维动态数组进行排序。我想按产品ID排序,并将结果显示为宽度为5.这是我的代码:

这部分很好,可以满足我的需求:

void readData (int**, int, int);
void printData(int**, int, int);
void sortbyPartID(int**, int, int);

int main()
{
    int index;
    int **PriceSheet, rows, columns;
    cout << "Enter the number of Products, and then the number of values associated with the products:  ";
    cout << "For default values, enter 5 (FIVE ITEMS, and enter 2 (TWO Values: ID and PRICE). ";
    cin >> columns >> rows;
    cout << endl;

    PriceSheet = new int* [rows];
    for (int row = 0; row < rows; row++)
        PriceSheet [row] = new int[columns];

    readData (PriceSheet, rows, columns);
    cout << endl;

    printData(PriceSheet, rows, columns);

    sortbyPartID(PriceSheet, rows, columns);

    return 0;

}

void readData (int **p, int rowSize, int colSize)
{
    for (int row = 0; row < rowSize; row++)
    {

        cout << "Row ZERO is the Product ID and Row 1 is the Product Price\n";
        cout << "Enter " << colSize << " numbers for the row number " << row << ": ";
        for (int col = 0; col < colSize; col++)
        cin >> p[row][col];
        cout << endl;
    }
}

void printData (int **p, int rowSize, int colSize)
{
    cout << "\n\nThese are the Products IDs and Prices as entered in the system:\n";
    for (int row = 0; row < rowSize; row++)
    {
        for (int col = 0; col < colSize; col++)
            cout << setw(5) << p[row][col];
        cout << endl;
    }
}

这部分是我需要帮助的地方

它正确读取并正确打印未排序的数组,但我无法想出一种排序数组的方法。具体来说,我需要有关void sortbyPartID函数的帮助。我想使用冒泡排序,我无法弄清楚如何让这个功能工作。任何有关排序功能/算法的帮助都将非常感激。

void sortbyPartID (int **p, int rowSize, int colSize)
{
    int swap = -1;
    int end = colSize;
    int sortedID = **p;
    cout << "\n\nThese are the Products sorted Products IDs:\n";

    for (int counter = colSize -1; counter >= 0; counter --)
        for (int index = 0; index < end ; index ++)
        {
            if (sortedID[index] > sortedID[index + 1])
            {
                swap = *sortedID[index + 1];
                sortedID[index + 1] = sortedID[index];
                *sortedID[index] = swap;
            }
        }

    for(int index = 0; index < end; index++)
    {
        cout << sortedID[index] << ", ";
    }
    cout << endl;
    end --;
}

当我跑步时,我在最后一节得到了一些奇怪的结果。也许我错过了一些简单的东西,不确定。

3 个答案:

答案 0 :(得分:1)

int sortedID = **p;不是您想要的,应该删除。 (我想你想要int** sortedID = p;

你的冒泡应该是这样的:

for (int counter = colSize -1; counter >= 0; --counter)
{
    for (int index = 0; index < end - 1 ; ++index)
    {
        if (p[index][0] > p[index + 1][0])
        {
            // std::swap(p[index], p[index + 1]);
            int* swap = p[index + 1];
            p[index + 1] = p[index];
            p[index] = swap;
        }
    }
}

Live Demo

答案 1 :(得分:1)

我们也可以使用do-while执行此操作,如下所示:

bool isSwaped;
do
{
    isSwaped = false;
    for (int index = 0; index < end - 1 ; ++index)
    {
        if (p[index][0] > p[index + 1][0])
        {
            int swap = p[index + 1][0];
            p[index + 1][0] = p[index][0];
            p[index][0] = swap;
            isSwaped = true;
        }
    }
} while (isSwaped);

答案 2 :(得分:1)

您可以使用对象简化整个事物。对象允许您以理智的方式处理相关数据。还强烈建议使用向量而不是C数组。

struct Product {
  int id;
  int price;
  vector<int> others;
}

然后,您可以将产品存储在vector<Product> my_products;中,然后使用

对所有内容进行排序
std::sort(my_products.begin(), my_products.end(),
          [](const Product& a, const Product& b) { return a.id < b.id; });

您可以保留现有的输入/输出格式,但将值放在正确的位置。通过这种方式,几乎不可能搞砸属性,一切都很容易使用。