「数据结构与算法」数组(列表)

发布于:2023-01-10 ⋅ 阅读:(465) ⋅ 点赞:(0)

        Hello😁大家好,我是PomeloMars😎.今天给大家带来了数据结构中的数组(列表)🈁,希望能帮助到各位程序猿们🙊.一键三连👍✊🙏可以加快更新速度哦,快来试试吧!😘

一、数组简介


        数组(列表)是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合,在这种数据结构上进行的基本操作包括对元素的的查找,插入和删除 —— 节选自百度百科

        数组下标 —— 数组里面的各个元素进行编号

        数组长度 —— 数组元素的个数

二、数组创建


int lst[5]; // 创建了一个名叫lst的数组,类型为int(整形)
memset(lst, 0x00, sizeof(lst)); // 将lst中每一个元素赋值为0x00(0),打印lst为[0,0,0,0,0]
char lst1[5] = {'A','B','C','D','E'}; // list对象也可以直接赋值,如lst1(char类型),打印lst1为[A,B,C,D,E]
float lst2[] = {1.2,2.3,3.4}; // 一维list对象可以不写长度,但必须立即赋值
double lst3[][] = {{1,2},{2,3},{3,4}}; // 这样会报错(Array has incomplete element type 'double []‘),因为二维及以上list除第一个方括号外所有项必须提供长度
double lst4[][3] = {{1,2},{2,3},{3,4}}; // 改为这样则不会报错

三、数组访问


        数组的访问方式为下标(索引)访问,比如一个叫做A的数组,其中有三个元素分别为“大”、“家”、“好”:

        当我们想要获取“大”这个字时,就要使用0这个下标:

A[0] = "大"
A[1] = "家"
A[2] = "好"

        特别提醒: 任何下标或索引均从0开始,而不是1 

四、数组遍历


         数组遍历可以用For循环

void ArrayTraversal(int lst[],int lstlen){
    for (int i=0;i<lstlen;i++){
        cout << lst[i] << " ";
    }
    cout << endl;
}

        我们依次访问数组中每一个下标对应元素的值,然后在每个打印后添加一个空格,最后换行

五、插入元素


        数组的有点就是在于访问元素十分的快速,而缺点就是插入删除比较慢,不过还是要了解一下的,毕竟也不是特别复杂(考试、面试可能会考哦🤭)

void lstinsert(int *lst,int lstlen,int pos,int value){
    for (int i=lstlen;i>=pos;i--){
        lst[i+1] = lst[i];
    }
    lst[pos] = value;
}

        我们从数组的长度位为开始,依次将每一项向后移一项,再将我们需要插入的pos位赋值为value

六、删除元素


        删除元素和插入元素截然相反,插入元素是往后移,而删除元素是往前移

void lstdelete(int *lst,int lstlen,int pos){
    for (int i=pos;i<lstlen;i++){
        lst[i] = lst[i+1];
    }
}

七、补充知识点:二分查找(折半查找) 


        二分查找是一种比顺序查找更加迅速的查找算法,前提是整个数组必须是有序的

        查找过程为(假设表中元素是按升序排列):

  1. 首先,将数组的中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功
  2. 否则利用中间位置记录将表分成前、后两个子数组
  3. 如果中间位置记录的关键字大于查找关键字,则进一步查找前一数组
  4. 否则进一步查找后一数组
  5. 重复以上过程,直到找到满足条件的记录,使查找成功
  6. 或直到子数组不存在为止,此时查找不成功
bool binaryfind(int *lst,int L,int R,int value){
    if (L>=R) return false;
    int mid = (L+R)>>1;
    if (lst[mid]==value) return true;
    else if (lst[mid]<value) return binaryfind(lst, mid+1, R, value);
    else return binaryfind(lst, L, mid-1, value);
}

        如果有的小伙伴不了解函数或递归的话,也可以用while循环实现:

bool binaryfind2(int *lst,int lstlen,int value){
    int L=0,R=lstlen-1;
    while (L<=R){
        int mid = (L+R)>>1;
        if (lst[mid]==value) return true;
        else if (lst[mid]<value) L = mid+1;
        else R = mid-1;
    }
    return false;
}

好啦!今天的内容就到此结束啦;一键三连不迷路,咱们下期见! 


网站公告

今日签到

点亮在社区的每一天
去签到