我是C编程的新手,正在尝试准备一些排序程序。我制作了线性/普通排序程序。
现在我想制作一个程序来排序2D数组。 即。
如果矩阵是
4 6 1
3 2 9
5 7 8
然后结果应该是
1 2 3
4 5 6
7 8 9
请帮我找一些关于此类程序的逻辑。
答案 0 :(得分:1)
由于您希望您的2D数组按行排序,这恰好是多维数组存储在C中的顺序,您可以假装它是一维数组并按此方式排序。
假设你有一个函数void sort(int[], int size);
,它接受指向1D数组的第一个元素及其大小的指针,你可以这样做
int a[3][3] = {{4,6,1}, {3,2,9}, {5,7,8}};
sort(&a[0][0], 9);
当然,这只适用于真正的2D数组,而不适用于指针数组,这是动态分配的2D数组通常用C实现的方式。
答案 1 :(得分:0)
如果要将内存分配为常规的多维声明,则可以使用几乎相同的函数...因为多维数组存储在内存行中,所以行和每行只是一个常规数组。 / p>
只需将矩阵的第一个元素的地址(通常为name_of_the_matrix[0]
)和矩阵中的元素数传递给函数。
希望我能提供帮助。
答案 2 :(得分:0)
你可以使用冒泡排序:Wikipedia并使用for循环遍历数组。
答案 3 :(得分:0)
基本思想是根据单元格排序对数组进行排序,因此您需要有一种方法可以根据单元格的顺序获取单元格,并根据顺序编写单元格。
int getCellOrder(int x, int y) {
return x*(x_width) + y;
}
int getXpos(int cellOrder) {
return cellOrder / x_width;
}
int getYpos(int cellOrder) {
return cellOrder % x_width;
}
使用这两个元素,您现在可以获取数组的任何两个单元格顺序以及它们引用的值。
int valueAt(int cellOrder) {
return array[getXpos(cellOrder)][getYpos(cellOrder];
}
如何比较订单以及如何交换它们现在变成了一个简单的一维阵列问题。
答案 4 :(得分:0)
您还可以采用C ++方法,并在1D中表示矩阵时执行以下操作:
#include <vector>
#include <algorithm>
using namespace std;
int main(int arg, char **argv) {
int matrix[] = {4, 6, 1, 3, 2, 9, 5, 7, 8};
vector<int> matvec (matrix, matrix + sizeof(matrix) / sizeof(int));
sort(matvec.begin(), matvec.end());
return 0;
}
答案 5 :(得分:0)
考虑到您创建了2D数组a [] []和像我这样的元素,我做到了:
for(i=0;i<row;i++)
for(j=0;j<col;j++)
for(k=0;k<row;k++)
for(p=0;p<col;p++)
if(a[i][j]>a[k][p])
temp=a[i][j]; a[i][j]=a[k][p]; a[k][p]=temp;