求二维数组中元素的第二大值,及行标列标
#include <stdio.h>
int main(int argc, char * argv[])
{
int arr[3][2] = {1,34,98,56,3,5};
int i,j,a = 0,b = 0,c = 0,d = 0;
for (i=0;i<3;i++)
{
for (j=0;j<2;j++)
{
if(arr[a][b]<arr[i][j])
{
a = i;
b = j;
}
}
}
for (i=0;i<3;i++)
{
for (j=0;j<2;j++)
{
if(arr[a][b]!=arr[i][j]&&arr[c][d]<arr[i][j])
{
c = i;
d = j;
}
}
}
printf("%d\t%d\t%d\n",arr[c][d],c,d);
return 0;
}
linux@linux:~/test/day6$ ./a.out
56 1 1
优化
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[3][3]={{34,97,6},{90,81,7},{13,5,79}};
int i,j,max=arr[0][0],sec_h=0,sec_l=0;
//求最大值的代码
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(arr[i][j]>=max)
{
max = arr[i][j];
}
else //保证第二大值一定不是最大值
{
sec_h = i;
sec_l = j;
}
}
}
//对数组中元素不重复的情况下通用
/* if(arr[sec_h][sec_l]==max)
{
sec_h = 1; //修改假定的第二大值
}*/
//求第二大值
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(arr[i][j]>arr[sec_h][sec_l]&&arr[i][j]!=max)
{
sec_h = i;
sec_l = j;
}
}
}
printf("arr[%d][%d]=%d\n",sec_h,sec_l,arr[sec_h][sec_l]);
return 0;
}
2.定义一个二维数组int arr[3][3]=1[34,97,6],[90,81,7],{13,5,79;对二维数组中的元素,进行冒泡排序
linux@linux:~/test/day6$ ./a.out
5 13 79
6 34 90
7 81 97
linux@linux:~/test/day6$ cat test7.c
#include <stdio.h>
int main(int argc, char * argv[])
{
int arr[3][3] = {{34,97,6},{90,81,7},{13,5,79}};
int i,j,k,a;
for (i=0;i<3;i++)
{
for(j=1;j<3;j++)
{
for(k=0;k<3-j;k++)
{
if(arr[i][k]>arr[i][k+1])
{
a = arr[i][k];
arr[i][k] = arr[i][k+1];
arr[i][k+1] = a;
}
}
}
}
for (i=0;i<3;i++)
{
for(j=1;j<3;j++)
{
for(k=0;k<3-j;k++)
{
if(arr[k][i]>arr[k+1][i])
{
a = arr[k][i];
arr[k][i] = arr[k+1][i];
arr[k+1][i] = a;
}
}
}
}
for (i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t",arr[i][j]);
}
putchar(10);
}
putchar(10);
return 0;
}
改正
只用二维数组
//只使用二维数组
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[3][3]={{34,97,6},{90,81,7},{13,5,79}};
int i,j,k,temp;
//冒泡排序的次数
for(i=1;i<9;i++)
{
for(j=0;j<3;j++) // 0 1 2
{
for(k=0;k<3;k++) // 0 1 2
{
if(k<2)
{
//同一行比较的情况
if(arr[j][k]>arr[j][k+1])
{
temp = arr[j][k];
arr[j][k] = arr[j][k+1];
arr[j][k+1] = temp;
}
}
//不同行比较的情况,上一行行尾和下一行行首
else if(j<2) //判断了行标越界
{
if(arr[j][k]>arr[j+1][0])
{
temp = arr[j][k];
arr[j][k] = arr[j+1][0];
arr[j+1][0] = temp;
}
}
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("arr[%d][%d]=%d\t",i,j,arr[i][j]);
}
printf("\n");
}
return 0;
}
通过一维数组
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[3][3]={{34,97,6},{90,81,7},{13,5,79}};
int i,j,k,temp;
int arr1[9];
//把二维数组放入一维数组中
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
arr1[k++]=arr[i][j];
}
}
//冒泡排序
for(i=0;i<9-1;i++)
{
for(j=0;j<9-1-i;j++)
{
if(arr1[j]>arr1[j+1])
{
temp = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = temp;
}
}
}
//把一维数组中的元素重新放入二维数组中
k=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
arr[i][j]=arr1[k++];
}
}
//打印输出
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("arr[%d][%d]=%d\t",i,j,arr[i][j]);
}
printf("\n");
}
return 0;
}