当第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 --;
}
当我跑步时,我在最后一节得到了一些奇怪的结果。也许我错过了一些简单的东西,不确定。
答案 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;
}
}
}
答案 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; });
您可以保留现有的输入/输出格式,但将值放在正确的位置。通过这种方式,几乎不可能搞砸属性,一切都很容易使用。