如何对二维数组进行排序
1个回答
展开全部
在C语言中,二维数组按行存储,对每一行排序很方便,可以把每一行当成一个一维数组,使用排序函数直接进行排序。
然而对每一列进行排序,就不能直接当成一维数组进行排序。但是仍然可以把第j列a[0...M-1][j]在逻辑上当成一维数组进行排序,下面以使用冒泡排序为例对其排序。
对二维数组按列排序后,进一步展示了如何调用快速排序函数按行进行排序。
程序源码:
#include <stdio.h>#include <stdlib.h> #define M 3#define N 3 //输出二维数组的函数void print(int a[][N]){ int i,j; for(i=0;i<M;i++) { for(j=0;j<N;j++) { printf("%d ",a[i][j]); } printf("\n"); } } //qsort的cmp函数int cmp(const void*a, const void *b){ return *(int*)a-*(int*)b;} int main(int argc, char* argv){ int a[M][N]={3,2,1,9,8,7,6,5,4}; printf("按列排序前的二维数组是:\n"); print(a); printf("\n"); int j; for(j=0;j<N;j++)//对每一列进行升序排序 { //对第j列进行排序 int m,n; int t; for(m=M-1;m>0;m--) { for(n=0;n<m;n++) { if(a[n][j]>a[n+1][j]) { t=a[n][j]; a[n][j]=a[n+1][j]; a[n+1][j]=t; } } } } printf("按列排序后二维数组变为:\n"); print(a); printf("\n"); //对按列排序后的二维数组按行升序排序 (调用快速排序函数) int i; for(i=0;i<M;i++) { qsort(a[i],N,sizeof(a[i][0]),cmp); } printf("按列排序后再按行排序后二维数组变为:\n"); print(a); printf("\n"); system("pause"); return 0;}
编译运行后的结果如下:
然而对每一列进行排序,就不能直接当成一维数组进行排序。但是仍然可以把第j列a[0...M-1][j]在逻辑上当成一维数组进行排序,下面以使用冒泡排序为例对其排序。
对二维数组按列排序后,进一步展示了如何调用快速排序函数按行进行排序。
程序源码:
#include <stdio.h>#include <stdlib.h> #define M 3#define N 3 //输出二维数组的函数void print(int a[][N]){ int i,j; for(i=0;i<M;i++) { for(j=0;j<N;j++) { printf("%d ",a[i][j]); } printf("\n"); } } //qsort的cmp函数int cmp(const void*a, const void *b){ return *(int*)a-*(int*)b;} int main(int argc, char* argv){ int a[M][N]={3,2,1,9,8,7,6,5,4}; printf("按列排序前的二维数组是:\n"); print(a); printf("\n"); int j; for(j=0;j<N;j++)//对每一列进行升序排序 { //对第j列进行排序 int m,n; int t; for(m=M-1;m>0;m--) { for(n=0;n<m;n++) { if(a[n][j]>a[n+1][j]) { t=a[n][j]; a[n][j]=a[n+1][j]; a[n+1][j]=t; } } } } printf("按列排序后二维数组变为:\n"); print(a); printf("\n"); //对按列排序后的二维数组按行升序排序 (调用快速排序函数) int i; for(i=0;i<M;i++) { qsort(a[i],N,sizeof(a[i][0]),cmp); } printf("按列排序后再按行排序后二维数组变为:\n"); print(a); printf("\n"); system("pause"); return 0;}
编译运行后的结果如下:
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询