二维数组排序
整型
1、以每行首元素值的大小来排列各行(方便理解
#include<stdio.h>
#include<stdlib.h>
#define row 9
#define col 9
int comp1(const void*a,const void*b)
{//升序
//在qsort的排序过程中,a代表(arr+i),b代表(arr+i+1),a、b都是二级指针(因为arr是二维数组) ,对其**得到((arr+i)+0)与((arr+i+1)+0)的值
//正确示范:可得到每行第一个元素的值,然后按每行第一个元素的值的大小来排列每行
return *(*(int**)a) - *(*(int**)b);
//错误示范:此处的*(int*)会取出每行首地址
//return *(int*)a - *(int*)b;
}
void print(const int**arr)
{
int i ,j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
printf("\n\n");
return 0;
}
int main()
{
int a[row][col] = {{5,6,7,8,9,1,2,3,4},
{6,5,4,3,2,1,9,8,7},
{7,8,9,1,2,3,4,5,6},
{1,9,8,7,6,5,4,3,2},
{3,2,1,9,8,7,6,5,4},
{9,8,7,6,5,4,3,2,1},
{8,9,1,2,3,4,5,6,7},
{4,3,5,6,7,8,9,1,2},
{2,1,3,4,9,8,7,6,5}};
int **arr1 = (int**)malloc(sizeof(int*)*row);
int i,j;
for(i=0;i<row;i++){
arr1[i] = (int*)malloc(sizeof(int)*col);
}
for(i=0;i<row;i++){
for(j=0;j<col;j++){
arr1[i][j] = a[i][j];
}
}
// 打印输入的数组
print(arr1);
//排序
qsort(arr1,row,sizeof(int*),comp1);
// 打印输入的数组
print(arr1);
return 0;
}
output:
5 6 7 8 9 1 2 3 4
6 5 4 3 2 1 9 8 7
7 8 9 1 2 3 4 5 6
1 9 8 7 6 5 4 3 2
3 2 1 9 8 7 6 5 4
9 8 7 6 5 4 3 2 1
8 9 1 2 3 4 5 6 7
4 3 5 6 7 8 9 1 2
2 1 3 4 9 8 7 6 5
1 9 8 7 6 5 4 3 2
2 1 3 4 9 8 7 6 5
3 2 1 9 8 7 6 5 4
4 3 5 6 7 8 9 1 2
5 6 7 8 9 1 2 3 4
6 5 4 3 2 1 9 8 7
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 8 7 6 5 4 3 2 1
2、我们不妨在其基础上添加功能,使其各行内部也排序