按位查找
GetElem(L, i)
按位查找操作——获取表L中第i个位置的元素的值
采用静态分配方式:
#define MaxSize 10//定义最大长度
typedef struct{
ElemType data[MaxSize];//用静态的“数组”存放数据元素
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义(静态分配方式)
ElemType GetElem(SqList L, int i){
return L.data[i-1];
}
采用动态分配方式:
#define InitSize 10//顺序表的初始长度
typedef struct{
ElemType *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
}SeqList;//顺序表的类型定义(动态分配方式)
ElemType GetElem(SeqList L, int i){
return L.data[i-1];
}
如果一个ElemType
占6B
,即sizeof(ElemType)==6
,指针data[0]
指向的地址为2000
那么data[1]
的地址就是2006
,data[2]
的地址就是2012
再次理解,为什么malloc
函数返回的存储空间起始地址要转换为与数据元素的数据类型相对应的指针[[2.2.1 顺序表的定义#^4b2725]]
按位查找的时间复杂度
ElemType GetElem(SeqList L, int i){
return L.data[i-1];
}
时间复杂度:O(1)
由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第i个元素——“随机存取”特性[[2.2.1 顺序表的定义#^0b5def]]
按值查找
LocateElem(L, e)
按值查找操作——在表L中查找具有给定关键字值的元素
#define InitSize 10
typedef struct{
ElemType *data;
int MaxSize;
int length;
}SeqList;
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L, ElemType e){
for(int i=0; i<L.length; i++)
if(L.data[i]==e)
return i+1;//数组下标为i的元素值等于e,返回其位序i+1
return 0;//退出循环,说明查找失败
}
提问: 如果说定义的是结构类型的数据元素是不是也可以用==
运算符呢?
答案: 不能,甚至无法编译。如果需要对比,需要自己编写代码,对于结构中的分量进行单独对比,如下面代码所示。
if(a.num == b.num && a.people == b.people){
printf("相等");
}else{
printf("不相等");
}
注意:
在考研初试中,手写代码可以直接用==
无论是ElemType
是基本数据类型还是结构类型
按值查找的时间复杂度
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L, ElemType e){
for(int i=0; i<L.length; i++)
if(L.data[i]==e)
return i+1;//数组下标为i的元素值等于e,返回其位序i+1
return 0;//退出循环,说明查找失败
}
代码分析:
最好情况:目标元素在表头,循环1次,最好时间复杂度=O(1)
最坏情况:目标元素在表尾,循环n次,最坏时间复杂度=O(n)
平均情况:假设目标元素出现在任何一个位置的概率都相同,都是
1
n
\frac{1}{n}
n1
i=0
,循环1
次;i=1
,循环2
次;……;i=n-1
,循环n
次
平均循环次数=
1
∗
1
n
+
2
∗
1
n
+
3
∗
1
n
+
.
.
.
+
n
∗
1
n
1*\frac{1}{n}+2*\frac{1}{n}+3*{1}{n}+...+n*\frac{1}{n}
1∗n1+2∗n1+3∗1n+...+n∗n1
=
n
(
n
+
1
)
2
1
n
\frac{n(n+1)}{2}\frac{1}{n}
2n(n+1)n1
=
n
+
1
2
\frac{n+1}{2}
2n+1
平均时间复杂度=O(n)