#include<stdio.h>
#include<stdlib.h>
int main(){
int **a,n,m,i,j,t=0,*p;
scanf("%d %d",&n,&m);
a=(int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++){
a[i]=(int*)malloc(sizeof(int)*m);
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
p=&a[0][0];
//选择排序
for(i=0;i<m*n;i++){
for(j=i;j<m*n;j++){
if(*(p+i)>*(p+j)){
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
}
//使每行(最后一行除外)最后只有换行符
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(j==m-1){
printf("%d",a[i][j]) ;
if(i!=n-1){
printf("\n");
}
}
else{printf("%d ",a[i][j]);
}
}
}
return 0;
}
有时会出现乱码(但是也有正常的,虽然没有完成排序)
3 5
2 5 4 332 2
32 34 4 3 3
24 5 3 2 5
-887674243 2 2 4 4
1551069797 1702130553 1986622020 3 3
24 5 3 2 5
数组在内存不是线性排列的吗,我用指针为什么无法完成排序呢
之后我把二维数组转成一维,用同样的指针操作,可以完成排序
#include<stdio.h>
#include<stdlib.h>
int main(){
int **a,n,m,i,j,t=0,*p,arr[100];
scanf("%d %d",&n,&m);
a=(int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++){
a[i]=(int*)malloc(sizeof(int)*m);
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
int k=0;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
arr[k] = a[i][j];
k++;
}
}
p=&arr[0];
for(i=0;i<m*n;i++){
for(j=i+1;j<m*n;j++){
if(*(p+i)>*(p+j)){
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
}
}
k=0;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
a[i][j]=arr[k];
k++;
}
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(j==m-1){
printf("%d",a[i][j]) ;
if(i!=n-1){
printf("\n");
}
}
else{printf("%d ",a[i][j]);
}
}
}
return 0;
}