IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言:数组(及冒泡排序) -> 正文阅读

[数据结构与算法]C语言:数组(及冒泡排序)

首先感谢一位博主: 原来45 他写的博客内容十分详细,为我创造博客提供了莫大的帮助,也为我解决了很多困难。

先贴出2篇他的文章

C语言从入门到入土(入门篇)(数组p1)_原来45的博客-CSDN博客

C语言从入门到入土(入门篇)(数组p2以及对递归的补充)_原来45的博客-CSDN博客

目录

1.数组的初始化

2.二维数组的创建、初始化、使用和储存

3.?数组越界

4.冒泡排序(升序)实现

5.数组名


1.数组的初始化

 int arr1[10]={1,2,3};  //这里代表前三个数初始化为1,2,3,而后面剩下的数组全部初始化为0;

 int arr2[]={1,2,3,4};  //这里表示这个数组的4个数字被初始化成了1,2,3,4,总共4个元素

char arr3[]={'a',98,'c'}; //这里的98实际上储存着的是b的ASCII码值

char arr4[]="abcdef";   //这个数组储存了7个元素,最后一个是\0

当用双引号包括时,结尾会自动加一个\0。

sizeof 和 strlen 的区别:

1)strlen是一个库函数,计算的是字符串的长度,并且只能针对字符串(无法针对整型的数),关注字符串中是否有\0,同时strlen计算的是\0之前的字符个数。即\0不会被strlen记录大小。

2)sizeof是一个操作符(运算符),sizeof是用来计算变量所占空间内存大小的,任何类型都是可以使用的,只关注空间大小,不在乎内存中是否存在\0。即\0也会被sizeof记录大小。

2.二维数组的创建、初始化、使用和储存

创建的方式如下:?

int arr [3][4];

char arr[3][5];

double arr[2][4];

这里以 int arr[3][4] 为例,看看二维数组是怎么存放数据的

?3指的是有3行(行竖着)? 4指的是有4列(列横着)

如何初始化呢?

int arr [ 3 ][ 4 ] = { 1 , 2 , 3 , 4 };
int arr [ 3 ][ 4 ] = {{ 1 , 2 },{ 4 , 5 }};
int arr [][ 4 ] = {{ 2 , 3 },{ 4 , 5 }}; 
//注意这里,行可以省略,列不能省略

那如果初始化没有那么多数字呢?不够的数字就会被初始化成0。

同时,也可以这样子初始化

怎么使用二维数组呢?

?二维数组如何存储呢?

?其实二维数组在内存中也是连续开辟空间的,每一个数字往后4个字节才是下一个数字。只不过为了方便理解,把二维数组画成矩阵的形状更加方便理解。

3.?数组越界

举个例子:数组共有十个数,而你访问了第十一个数,这就叫越界。

这里越界了但是没有报错:

?这里报错了:

4.冒泡排序(升序)实现

什么事冒泡排序?

现有一个有10个数的数组,10个数字随机排序,让其有序排列,这就是冒泡排序。

首先我们先来了解如何求一个数组的长度:

int sz = sizeof(arr) / sizeof(arr[0]);

用这个数组的总占空间大小除以这个数组第一个元素所占空间大小,就得到了这个数组的长度。

?我们先写主函数:

int main()
{
	int arr[] = { 3,6,4,5,8,0,7,9,1,2};//定义一个数组

	bubble_sort(arr, sz);//调用函数
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		printf("%d ", arr[i]);//打印数组的每一位
	}
	return 0;
}

排序函数,核心思想:两个数相比较,如果前一个数比后一个数大,两个数字就交换位置

void bubble_sort(int arr[])
{
int sz = sizeof(arr) / sizeof(arr[0]);
	int j = 0;
	for (j = 0; j < sz - 1; j++)//我们比的时候只在同一个位置比,然后后面谁小我们就把谁换过来,一直到最后一个数我们就发现有sz个数,我们就要进行sz-1趟比较
	{
		int k = 0;
		for (k = 0; k < sz - 1 - j; k++)每一趟比较的次数就是 sz-1 再 -j(因为前面的数已经排好了所以减去)
		{
			if (arr[k] >= arr[k + 1])
			{
				int tmp = arr[k];
				arr[k] = arr[k + 1];
				arr[k + 1] = tmp;
			}
		}
	}
}

代码运行,发现代码没有达到我们想要的作用,我们可以打开调试看一下:

?为什么sz的值是1呢?哪里出问题了呢?

当我们传递arr时,传递的其实是首元素地址,形参接受的也是首元素地址,arr为指针,用sizeof算出来的大小是4,除以arr第一个元素的大小,4/4=1,所以我们要把sz放在主函数里面求,直接传一个整形的sz的值给函数。

代码修正后:

void bubble_sort(int arr[],int sz)
{
	int j = 0;
	for (j = 0; j < sz - 1; j++)
	{
		int k = 0;
		for (k = 0; k < sz - 1 - j; k++)
		{
			if (arr[k] > arr[k + 1])
			{
				int tmp = arr[k];
				arr[k] = arr[k + 1];
				arr[k + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = {3,5,7,9,1,2,4,6,0};
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

修改后,我们可以排列无限个数字

void bubble_sort(int arr[],int sz)
{
	int j = 0;
	for (j = 0; j < sz - 1; j++)
	{
		int k = 0;
		for (k = 0; k < sz - 1 - j; k++)
		{
			if (arr[k] >= arr[k + 1])
			{
				int tmp = arr[k];
				arr[k] = arr[k + 1];
				arr[k + 1] = tmp;
			}
		}
	}
}

int main()
{
	int arr[] = { 3,2,6,666666,55555555,7777777,2572457,2472457,568458,59679,2,4,7,8,4,9,4,2,8,1,4};
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);
	int i = 0;
	for (i = 0; i < sz-1; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这样,一个冒泡排序就完成了。?

5.数组名

先说结论:数组名是数组首元素的地址。

printf ( "%p\n" , arr);

printf ( "%p\n" , & arr[0]);

//两个表达式意思相等

但有两个例外:(在此假设数组名字定为arr)

1. sizeof(arr)?,计算的是整个数组的大小。?sizeof?内部单独放一个数组名,数组名表示整个数组。

2.? &arr,取出的是数组的地址。?&arr,数组名表示整个数组。

对于第二点,额外补充一下:

如果 &arr +1,即 数组+1 则会跳过这个数组所有的数字,会在内存中直接显示到这个数组最后一个数字的后面。

在此,数组的基础知识就讲完了,消化去吧~下一篇就是恐怖的井字棋!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:06:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:37:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码