從鍵盤輸入5行4列的二維整型數組 a 的各元,然后將數組a各列元素分別按升序排序,再按行輸出數組a的各元.#include <stdio.h>#define M 5#define N 4main(){int a[M][N],i,j,k,t=0;for(i=0; i<M; i++)for(j=0; j<N; j++)scanf("%d", &a[i][j]);for(j=0;j<N;j++){for(i=0;i<M;i++){for(k=0;k<M;k++)if(a[k][j]>a[k+1][j]){ t=a[k][j];a[k][j]=a[k+1][j];a[k+1][j]=t;}}}for(i=0;i<M;i++){printf("\n");for(j=0;j<N;j++)printf("%d ",a[i][j]) ;}}
2 回答

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
在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; } |
編譯運行后的結果如下:

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
冒泡法。。
#include <stdio.h>
#define M 5
#define N 4
void main()
{
int a[M][N],i,j,k,t=0;
for(i=0; i<M; i++)
for(j=0; j<N; j++)
scanf("%d", &a[i][j]);
for(j=0;j<N;j++)
{
for(i=0;i<M;i++)
{
for(k=M-1;k>i;k--)
if(a[k][j]<a[i][j])
{
t=a[k][j];
a[k][j]=a[i][j];
a[i][j]=t;
}
}
}
for(i=0;i<M;i++)
{
printf("\n");
for(j=0;j<N;j++)
printf("%d ",a[i][j]) ;
}
}
你的K+1會超過M的。
- 2 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消