一维的可以理解为行形式
成都创新互联是一家专注网站建设、网络营销策划、小程序开发、电子商务建设、网络推广、移动互联开发、研究、服务为一体的技术型公司。公司成立十多年以来,已经为近千家食品包装袋各业的企业公司提供互联网服务。现在,服务的近千家客户与我们一路同行,见证我们的成长;未来,我们一起分享成功的喜悦。
二维的是行列式
三维的可以这样理解
每一个[]代表一个方向 当然三维以上的数组不太容易用实体模式想像 但大概方式是一样的
先搞明白1 2 3维对应于下标的方式 指针 地址的对应关系
比如对于int a[2][3][4]而言
a[1] a[1][1] a[1][1][1] a[1][1][3] a[1][2][0]
搞清以上几项的地址关系
组数基本我们可以按行读来理解[具体对应于代码]
即 1维 从左向右读
2维 a[2][3] 从左向右工a[][0]~a[][2] 3格 成为一行 每一行对应一个a[]
三维a[4][2][3]的在此基础上增加到4个层面 (原来的2维对应为2*3格的一个面)
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Selectsort(int *arr, int sz)
{for (int end=sz-1; end=0; end--)
{
int max = end;
int i;
for ( i = 0; i = end; i++)//选出最大下标
{
if (arr[i] arr[max])
{
max = i;
}
}
Swap(arr, arr[max]);
}
}
int main()
{
int arr[5] = { 1, 3, 2, 5, 4 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i = sz - 1; i++)
{
scanf("%d", arr[i]);
}
Selectsort(arr, sz);
for (int i = 0; i = sz - 1; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}
扩展资料:
printf函数使用注意事项
1、域宽
%d:按整型数据的实际长度输出。
如果想输出指定宽度可以指定域宽,%md--gt;m域宽,打印出来以后,在控制台上,显示m位;
如果要打印的数的位数如果超过我们设定m则原样输出;
如果要打印的数的位数如果小于设定的位数,则补空白,具体如下:
如果m为正数,则左对齐(左侧补空白);
如果m为负数,则右对齐(右侧补空白)。
2、转义字符
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示。
如:printf("%f%%",1.0/3);输出结果:0.333333%。
同意一楼方法,讲二维数组存到一维数组中,然后用qsort排序,再存到二维数组当中
代码敲了一下,发现C语言快忘光了
#include stdio.h
#include stdlib.h
int comp(const void *a , const void *b){
return *(int *)b - *(int *)a; //这是b-a,如果是a-b就是从小到大排序
}
int main(){
int a[3][3];
int b[9];
int n;
int i , j , k;
for(i = 0 , k = 0; i 3 ; i ++)
for(j = 0 ; j 3 ; j ++){
scanf("%d",a[i][j]);
b[k++] = a[i][j]; // k ++别看漏
}
qsort(b,9,sizeof(int),comp);//qsort函数很简单的,看看就会,不怕麻烦,comp函数是指定排序是从小到大还是从大到小
for(i = 0 , k = 0; i 3 ; i ++)
for(j = 0 ; j 3 ; j ++){
a[i][j] = b[k++];
printf("%d",a[i][j]);
}
system("pause");
return 0;
}
qsort看不懂再给你个百科的链接
自己再敲一次吧,代码是敲出来的,多练练
ps:那个int n是多余的,你的代码测试了,可以
在C语言中,二维数组按行存储,对每一行排序很方便,可以把每一行当成一个一维数组,使用排序函数直接进行排序。 然而对...
无论是多少维的数组,机内都是一维的,以行优先存放。所以直接降为一维数组排序最方便省事。下面以二维数组为例写出代码——
#include "stdio.h"
int main(int argc,char *argv[]){
int x[3][3]={{9,4,3},{6,2,7},{5,8,1}},i,j,k,*p;
printf("Before ordering is as follows:\n");
for(i=0;i3;i++){
for(j=0;j3;printf("%2d",x[i][j++]));
printf("\n");
}
for(p=(int *)x,i=0;i9;i++){//用p=(int *)x将x降为一维数组p,选择法排序
for(k=i,j=k+1;j9;j++)
if(p[k]p[j])
k=j;
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j;
}
printf("Sorted as follows:\n");
for(i=0;i3;i++){//输出排序后的二维数组
for(j=0;j3;printf("%2d",x[i][j++]));
printf("\n");
}
return 0;
}
运行结果:
第一处填空,是个三重循环:
for(i=0;iN;i++)
for(j=0;jN+1;j++)
for(k=j+1;kN;k++)
这里,i是数组的行标号,第一重循环表示依次对N行数组分别排序
然后j和k是列下标,一个二重循环排序的过程,其原理如下:
比如2 3 5 1 0 按从小到大排序
首先,j=0 k=1~4,就是数字2分别与3 5 1 0比较,把小的放到2的位置来
一轮之后,就变成 0 3 5 2 1
第二轮,j=1 k=2~4 ,就是数字3分别与5 2 1比较,把最小的放到3的位置
就是依次找出最小的放在最前,找出第二小的,放第二个位置……
依次这样循环到最后,就能完成排序
第二个填空,是要完成“第0行从小到大排序,第1行从大到小排序,第2行从小到大排序,第3行从大到小排序”这样的功能,这样填:
if(i%2==1?a[i][j]a[i][k]:a[i][j]a[i][k])
表示,如果i%2==1(即i是奇数行标),则采用a[i][j]a[i][k]这个判断条件,否则就采用a[i][j]a[i][k]这个判断条件
这样就能实现偶行从小到大排序,奇行从大到小排序咯
=============================================
1
outarr(aa);
这样是把数组的地址当作实参传递过去,而,形参是这样
void outarr(int a[N][N])
这说明白形参是接受的数组的值啊???
这是怎么回事?
这里不是按地址传递,定义void outarr(int a[N][N])表示的是按数组整个传递,并且数组做为参数传递有个特点,就是一定是按引用传递
知道什么是按引用传递吗?简单理解,就是在函数里面,对该参数的修改,会影响主函数中该参数的值
====================================================
2
在主函数中
数组的定义是这样的
int aa[N][N]
表示未知行和列
但初始化又是这样
int aa[N][N]={{2,3,4,1},{8,6,5,7},{11,12,10,9},{15,14,16,13}};
这样能算对吗?
这里数组的定义不是未知行和列
我们语庋规则规定,数组定义,必须用明确定义行列的数目
其实这里的N不是一个变量,而已经变成一个数字了,看上面的定义:
#define N 4
这一句定义,等于告诉编译器,每逢碰到N,就把它换成4的意思
那么其实数组定义就是int aa[4][4]
=====================================================
3
第一个被调函数
void sort(int a[][N])
它里面省略的行,我知道,二维数组可以这么写,但,在这个被调函数中,要使用到行数啊,它不给出,后面,怎么计算呢?
这个程序中,行数N在前面已经定义了
在整个程序的过程中,N不是一个变量,而是表示数字4!!