嵌入式学习C语言(八)二维数组及排序算法

目录

一、二维数组

二、二维字符数组


一、二维数组

1.定义形式 类型说明符 数组名[常量表达式1][常量表达式2]; 连续性、有序性、单一性

表达式1可以理解为行,表达式2可以理解为列。

int a[3][4]; //表示有3个 长度为4的一维数组。

//此时,a[0],a[1],a[2]为一个一维数组的数组名。

int a[3][4][5]; // 可理解为,有三个元素,每个元素都是一个二维数组 。

依次类推,但一般只用到二维数组

2.a[0]为一维数组数组名,等价&a[0][0](整型变量的4个字节首地址);此时为整形指针

a为二维数组数组名,等价&a[0](一维数组16个字节的首地址);此时为数组指针

3.二维数组初始化

int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

未全部赋初值的数组剩余元素会自动赋值为0

int a[3][4] = {{1,2,3,4},{5,6,7},{9,10,11,12}} ;//因为第二个数组只有3个数据,此时会在 a[1][3] //自动赋值0。

int a[3][4] = {1,2,3,4,5,6,7,9,10,11,12}; //因为数组需要3X4个数据,而此时只有11个,因此会

//最后一个空间中写入0即在a[2][3]中赋值0。

int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //二维数组定义时,只有第一个[]内的数可以省略,会跟据 //初始化数据量,默认分配大小。

eg1 二维数组元素遍历

cpp 复制代码
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;

	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			sum += a[i][j];
			printf("%2d ", a[i][j]);
		}
		puts("");
	}

eg2 计算二维数组元素和

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;

	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	int sum = 0;
	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			sum += a[i][j];
		//	printf("%2d ", a[i][j]);
		}
		//puts("");
	}
	
	printf("%d\n", sum);
	return 0;
}

eg3 每行元素逆序

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols / 2;++j)
		{
			int t;
			t = a[i][j];
			a[i][j] = a[i][cols - j - 1];
			a[i][cols - j - 1] = t;
		}
	}

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			printf("%2d ", a[i][j]);
		}
		puts("");
	}
	return 0;
}

eg4 计算二维数组边框数的和。

cpp 复制代码
int main(void)
{
	int a[][4] = {1,2,3,4, 5,6,7, 8, 9,10,11,12};
	int i, j;
	int sum = 0;
	int rows = sizeof(a) / sizeof(a[0]);
	int cols = sizeof(a[0]) / sizeof(a[0][0]);

	for(i = 0;i < rows;++i)
	{
		for(j = 0;j < cols;++j)
		{
			if(0 == i || 0 == j || rows - 1 == i || cols - 1 == j)
			{
				sum += a[i][j];
			}
		}
	}
	printf("%d\n", sum);

	return 0;
}

eg5 输出魔方数

cpp 复制代码
int main(void)
{
	int a[3][3] = {0};
	int i = 0, j = 1;
	int n;
	a[i][j] = 1;

	for(n = 2;n < 10;++n)
	{
		int x = i;
		int y = j;
		++j;
		if(j > 2)
		{
			j = 0;
		}
		--i;
		if(i < 0)
		{
			i = 2;
		}

		if(a[i][j] != 0)
		{
			i = x;
			j = y;
			++i;
			if(i > 2)
			{
				i = 0;
			}
		}

		a[i][j] = n;
	}

	for(i = 0;i < 3;++i)
	{
		for(j = 0;j < 3;++j)
		{
			printf("%2d ", a[i][j]);
		}
		puts("");
	}

	return 0;
}

二、二维字符数组

1. char s[3][100] = {"Hello","World","China"}; 与整型类似

eg1 遍历输出

cpp 复制代码
int rows = sizeof(a)  / sizeof(a[0]) 定义行号的个数
int cols = sizeof(a[0]) / sizeof(a[0][0]) 定义列号的个数

for(i = 0;i < rows;++i)

     {

            puts(s[i]);

     }

eg2 字符串比较求最大。

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "america"};
	char max[100];
	int i;
	int rows = sizeof(s) / sizeof(s[0]);

	strcpy(max, s[0]);
	
	for(i = 1;i < rows;++i)
	{
		if(strcmp(max, s[i]) < 0)
		{
			strcpy(max, s[i]);		
		}
	}

	puts(max);

	return 0;
}

eg 3 字符串逆序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China"};
	int rows = sizeof(s) / sizeof(s[0]);
	int i;
	for(i = 0;i < rows / 2;++i)
	{
		char t[100];
		strcpy(t, s[i]);
		strcpy(s[i], s[rows - i - 1]);
		strcpy(s[rows - i - 1], t);
	}
	
	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}

	return 0;
}

eg4 字符串选择排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);
	
	int i, j;

	for(i = 0;i < rows - 1;++i)
	{
		for(j = i + 1;j < rows;++j)
		{
			if(strcmp(s[i], s[j]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[j]);
				strcpy(s[j], t);
			}
		}
	}

	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}
	return 0;
}

eg5 字符串冒泡排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);

	int i, j;
	for(j = rows - 1;j > 0;--j)
	{
		for(i = 0;i < j;++i)
		{
			if(strcmp(s[i], s[i + 1]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[i + 1]);
				strcpy(s[i + 1], t);
			}
		}
	}

	for(i = 0;i < rows;++i)
	{
		puts(s[i]);
	}
	return 0;
}

eg6 字符串插入排序

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);
	
	int i, j;

	for(i = 0;i < rows ;++i)
	{
        char t[100];
        strcpy(t,s[i]);
        j=i;
        while(j>0 && strcpy(s[j-1],t)>0)
        {
            strcpy(s[j],s[j-1]);
            --j;
        }
        strcpy(s[j],t);
    }
    for(i=0;i<rows;++i)
    {
        puts(s[i]);
    }
    return 0;
}

eg7 字符串的二分查找法 前提也是排好顺序的

cpp 复制代码
int main(void)
{
	char s[][100] = {"Hello", "World", "China", "America"};
	int rows = sizeof(s) / sizeof(s[0]);

	int i, j;
	for(j = rows - 1;j > 0;--j)
	{
		for(i = 0;i < j;++i)
		{
			if(strcmp(s[i], s[i + 1]) > 0)
			{
				char t[100];
				strcpy(t, s[i]);
				strcpy(s[i], s[i + 1]);
				strcpy(s[i + 1], t);
			}
		}
	}


	char n[100] = "China!";
	int begin = 0;
	int end = rows - 1;
	int mid;

	while(begin <= end)
	{
		mid = (begin + end) / 2;
		if(strcmp(s[mid], n) > 0)
		{
			end = mid - 1;
		}
		else if(strcmp(s[mid], n) < 0)
		{
			begin = mid + 1;
		}
		else
		{
			break;
		}
	}

	if(begin <= end)
	{
		puts("found");
	}
	else
	{
		puts("not found");
	}


	

	return 0;
}
相关推荐
thusloop1 小时前
380. O(1) 时间插入、删除和获取随机元素
数据结构·算法·leetcode
MobotStone1 小时前
无代码+AI时代,为什么你仍然需要像个开发者一样思考
人工智能·算法
緈福的街口1 小时前
【leetcode】584. 寻找用户推荐人
算法·leetcode·职场和发展
basketball6161 小时前
Linux C 管道文件操作
linux·运维·c语言
future14122 小时前
游戏开发日记
数据结构·学习·c#
今天背单词了吗9802 小时前
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·笔记·考研·算法·蒙特卡洛算法
ydm_ymz2 小时前
C语言初阶4-数组
c语言·开发语言
wjcurry2 小时前
完全和零一背包
数据结构·算法·leetcode
hie988942 小时前
采用最小二乘支持向量机(LSSVM)模型预测气象
算法·机器学习·支持向量机
棱镜研途3 小时前
学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用
图像处理·笔记·学习·计算机视觉·cnn·卷积神经网络·信号处理