数据结构整理-数组篇

数组

一种线性结构,将相同元素存储在连续的内存空间中,元素在数组中的位置称之为索引,即数组下标。

1. 初始化数组

i:不给定初始值,如:int arr[5] //存储在栈上,无需手动释放

                                     int* arr1=new int[5]//存储在堆上,需要手动释放

ii: 给定初始值, int arr[5]={1,2,,3,4,5}//存储在栈上,无需手动释放

                                int* arr1=new int[5] {1,2,3,4,5};//存储在堆上,需要手动释放

2.访问元素

给定数组元素的地址(首元素的地址)和某个元素的索引,可通过下式计算该元素的内存地址,从而直接访问该元素。

注意:索引本质上是内存地址的偏移量。首元素的索引是0,即首元素的地址偏移量为0。

        数组访问元素的时间复杂度是O(1)。

3. 插入元素

因为数组元素是连续存储的,所以要想在数组中间某个位置插入元素,必须把该位置的元素以后的所有数据都往后移动一位(其实就是从后往前的复制)。再用索引的方式为该位置的元素赋值。

void insert(int*nums, int size, int num, int index){
    //nums是数组,size数组长度,num是待插入的数值,index是插入的位置
    for(int i=size-1; i>index; i--){
        nums[i]=nums[i-1];
    }
    nums[index] =num;//插入目标元素
}

4. 删除元素

删除索引i处的元素,需要把索引i之后的元素都向前移动一位(其实就是从i处往后不断复制),注意:删除一个元素后,最后一个元素会变得”无意义“,无需特意修改它。

void del(int *nums, int size, int index){
    //删除index位置的元素
    for(int i=index; i<size-1; i++){
        nums[i]=nums[i+1];
    }
}

插入和删除数组元素的时间复杂度是O(n), 插入元素会使得超出数组范围的元素丢失

5. 遍历数组

可以通过索引(0~size-1)遍历数组。

6. 查找元素

查找元素可以通过遍历,一一判断元素是否匹配,若匹配则输出对应的索引值。

int find( int* nums, int size, int target){
    for(int i=0; i<size; i++){
        if(nums[i]==target){
            return i;//返回找到的索引值。
        }
    }
    return -1;//没找到
}

7. 扩容数组

大多数编程语言中,数组的长度是不可变的。

如需要扩容数组,则需要建立一个新的更大的数组,然后把元素一一复制到新数组中。时间复杂度O(n)。数组很大时,耗时长。

int* extend(int* nums, int size, int enlarge){
    //初始化一个扩展enlarge的数组
    int *ans =new int[size+enlarge];
    for(int i=0;i<size; i++){
        ans[i]=nums[i];//将元素一一复制
    }
    //记得释放原数组的内存
    delete[] nums;

    return ans;//返回扩展后的数组,(记得返回数组,本质上是返回首元素的地址)
}

声明:本人所写内容全部参考hello-algo,仅用于个人复习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值