1.1 初识数组
数组作为最基础,最常用的数据结构,大多数人可能会觉得它很简单,但是,你真的了解数组吗?看完这篇文章,带你认识更深层次的数组。
首先我们要知道,数组是什么呢?数组是存放相同数据类型元素的集合,我们可以通过索引来访问数组,需要注意的是,数组中第一个元素的索引为0,最后一个元素的索引是size-1;并且,数组中的元素在内存中是连续存放的,且每个元素占用相同大小的内存,如图所示:
1.2 数组基本操作
1.2.1 数组创建和初始化
数组的初始化方法通常分为以下几种:
- int arr[] = {1,3,4,6,7,8,9} //这是很常用的一种初始化方法,根据赋值元素的个数默认数组初始化大小
- int arr[10] = {1,2,3,4,5,6} //这种初始化方法直接指定了数组的大小,若初始化时未完全初始化,则后续内容自动补0
- for(int i = 0;i<n;i++) arr[i] = i; //这是利用循环赋值进行初识化,但数据比较固定,不适用于大多数情况
1.2.2 查找一个元素
数组相对于链表最大的特点就是可以直接通过下标查找元素,基本实现如下:
int findByElement(int arr[],int size,int key)
{
for(int i = 0;i<size;i++)
{
if(arr[i] == key)
{
return i;
}
}
return -1;
}
1.2.3 增加一个元素
这个问题看似简单,但数组的边界问题很多人都会忽视,所以一定要亲手实现一次,不能感觉简单就不写。数组的插入分为以下三步:1.找到插入位置 2.插入位置之后的元素整体右移 3.将元素插入到空位置上,基本实现如下:
int addByElement(int arr[],int size,int ele)
{
if(size >= sizeof(arr) / sizeof(arr[0])
{
return -1;
}
int index = size //问题一:为什么index要初始化为size
for(int i = 0;i<size;i++)//问题二:这里是否可以是size-1
{
if(ele < arr[i])
{
index = i;
break;
}
}
for(int j = size;j>index;j--) //问题三,j为什么初始化为size
{
arr[j] = arr[j-1];
}
arr[index] = ele;
return index;
}
对于以上三个问题,请大家认真思考后再看解答,解答如下:
1.这里只能令index = size,0 或者 size - 1均不可以,为什么呢?假设序列有序,若在循环中无法找到合适的位置插入,则必须插入到元素的末尾,例如:已知序列为{3,4,7,8},如果插入的元素比8大,例如9,如果index初始化为0,则最后结果是{9,3,4,7,8};如果index初始化为size - 1,则最后结果为{3,4,7,9,8} ,显而易见,两种答案均错误。
2.这里不能初始化为size- 1,若初始化为size-1,则下标为size- 1的元素不会被遍历。
3.j为什么要初始化为size呢?因为在插入元素之后,实际上我们用到的空间比之前多了一个,所以下标的size的空间就需要用来存放下标为size-1的元素。文章来源:https://www.toymoban.com/news/detail-653983.html
1.2.4 删除一个元素
理解插入元素之后,删除元素就变得十分简单了,删除元素只需两步:1.找到需要删除的元素 2.将删除位置之后的元素全部向前移动一格,基本实现如下:文章来源地址https://www.toymoban.com/news/detail-653983.html
int deleteByelement(int arr[], int size, int key, int length)
{
int index = -1;
for (int i = 0; i < size; i++)
{
if (key == arr[i])
{
index = i;
break;
}
}
if (index != -1)
{
for (int j = index + 1; j < size;j++)
{
arr[j - 1] = arr[j];
}
size--;
}
return size;
}
到了这里,关于算法通关村——不简单的数组增删改查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!