【数据结构】顺序表:简单而实用(比较水

前言

最近开始学习数据结构 就重新拾起写博客的习惯 来记录一下 今天就来学一下顺序表和链表

小提示:引用的部分可看可不看 以及 这篇文章使用的是C语言

引入:线性表

在学习顺序表之前 我们先来了解一下线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使

用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

需要注意的是:

线性表在逻辑上是线性结构 ,也就说是连续的一条直线。但是在物理结构上并不一定是连续的 ,(比如数组和链表)

线性表在物理上存储时,通常以数组和链式结构的形式存储。

顺序表

概念及结构

顺序表是用一段物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

分类

顺序表可以分为静态顺序表动态顺序表

静态顺序表:使用定长数组存储元素

比如下面这个例子

cpp 复制代码
	int arr[10];

补充:

静态顺序表并不常用 因为他是定长的 在实际情况中 长度给小了是不够 给大了是浪费

动态顺序表:使用动态开辟的数组存储。

给出一个例子:

cpp 复制代码
	int* array;
	size_t size;
	size_t capicity;

大概意思是

array是头部

size记录的是有效的数据个数

capacity记录的是空间容量

(扩容倍数一般是2倍或者1.5倍数

题目

下面来看两道题

题目一

题干

题目链接

题干分析

非严格递增 :表示的是非递减 即有可能出现两个元素相等的情况 并且 数组是已经排序好的元素

比如 1 2 2 3 4 5这种

代码示例
cpp 复制代码
int removeDuplicates(int* nums, int numsSize) {
	int p1 = 1, p2 = 0;
	while (p1 < numsSize)
	{
		if (nums[p2] != nums[p1]) {
			nums[++p2] = nums[p1++];
		}
		else {
			++p1;
		}
	} 
	return p2 + 1;
}
代码解析

我们可以用双指针来实现去重

分为两种情况

1、p1 == p2

p1++

2、p1 != p2

p2++

arr[p2] = arr[p1]

p1++

实际上就是让p1 从前向后一次寻找与p2位置不相同的值 并进行覆盖存储

题目二

题干

题目链接

代码示例
cpp 复制代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
	int i1 = m - 1, i2 = n - 1;
	int j = m + n - 1;

	while (i1 >= 0 && i2 >= 0)
	{
		if (nums1[i1] > nums2[i2])
		{
			nums1[j--] = nums1[i1--];
		}
		else
		{
			nums1[j--] = nums2[i2--];
		}
	}

	while (i2 >= 0)
	{
		nums1[j--] = nums2[i2--]; 
	}
}
代码解析

两种做法:

依次比较 将小的元素尾插到新的数组中

依次比较 将大的从后往前放

上面的代码采取的是第二种方式

需要注意的是:

注意点1

结束条件不能写j>0

因为i1 和 i2有可能越界可以看下面这个例子

i1还没有遍历完 但i2已经越界了

注意点2

当i1和i2中有一个小于0就结束循环

但在循环中写的是能使循环继续的条件

所以是&&

cpp 复制代码
	while (i1 >= 0 && i2 >= 0)
注意点3

当i1<0 是需要处理的

当i2<0就结束了 是不需要处理的

总结

效率

尾部插入 的效率还不错 但头部插入或者中间插入删除就需要挪动数据 效率低下

扩容

扩容时 是存在着一定的消耗的(空间浪费

比如 从100扩容到200 但我只插入120个数据 那剩下的80个就浪费了

结语

就简单的介绍一下顺序表 再做几道题 做一个引入

(至于顺序表的模拟 (有时间再做

链表再见~

相关推荐
重生之我要进大厂1 小时前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
Happy鱿鱼2 小时前
C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)
c语言·开发语言·数据结构
KBDYD10102 小时前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
Crossoads2 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
QXH2000003 小时前
数据结构—单链表
c语言·开发语言·数据结构
imaima6663 小时前
数据结构----栈和队列
开发语言·数据结构
David猪大卫3 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ3 小时前
数据结构(Day14)
linux·c语言·数据结构·算法
Beauty.5684 小时前
P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
数据结构·c++·算法
爱棋笑谦4 小时前
二叉树计算
java·开发语言·数据结构·算法·华为od·面试