欢迎光临散文网 会员登陆 & 注册

数据结构学习小记8(查找+排序1)

2019-08-24 23:25 作者:弃疗的中二病拱卒者  | 我要投稿

散列查找法时,有以下方式解决冲突:

开放地址法:

(1)线性探测法:将散列表假想成一个循环表,发生冲突时,从冲突地址的下一单元开始,顺序查找空单元,如果到最后也没有找到空单元,则回到表头开始继续查找,直到找到一个空位,就把此元素放入到此空位中,若找不到空位,则说明散列表已满,需要进行溢出处理。

(2)二次探测法:H(H(key)+di)%m     i=1,2,3,...,k(k<=m-1)

di=1^2,-1^2,2^2,-2^2,3^2,...,+k^2,-k^2(k<=m/2)

(3)伪随机探测法:di=伪随机数序列

链地址法:把具有同样散列地址的记录放在同一个链表中。有m个散列地址就有m个单链表。

排序方法的分类

接下来就直接放图说话啦~

直接插入排序

()中为已排好序的记录的关键字

直接插入排序的过程

通过此过程发现,虽然黑色的49和绿色的49数值大小相等,且经过一轮排序后,绿色的49仍然在黑色的49后面,所以这是一个稳定排序。

【算法描述】

void InsertSort(SqList &L)

{

for(i=2;i<=L.length;++i)//从2开始

if(L.r[i].key<L.r[i-1].key)//小于即插入

{L.r[0]=L.r[i]; //将待插入的记录暂存到监视哨中

L.r[i]=L.r[i-1]; //r[i-1]后移

for(j=i-2;L.r[0].key<L.r[j].key;--j) //将哨兵位和“括号”里的比较,放在比自己小的数后面

     L.r[j+1]=L.r[j];

L.r[j+1]=L.r[0]; 

}

}

【算法分析】

(1)时间复杂度为O(n^2),空间复杂度为O(1)

(2)对存储结构没有要求,适用于初始记录基本有序,当基本无序且n较大时,时间复杂度高,不宜采用。

折半插入排序:利用折半查找操作实现查找操作,再进行插入排序

【算法描述】

void BInsertSort(SqList &L)

{

for(i=2;i<=L.length;++i)

{ L.r[0]=L.r[i];

 low=1;high=i-1;

while(low<=high)

{

  m=(low+high)/2;

 if(L.r[0].key<L.r[m].key)

   high=m-1;

else low=m+1;

}

for(j=i-1;j>=high+1;--j) 

L.[j+1]=L.[j]; //记录后移

L.r[high+1]=L.r[0];

}

}

希尔排序:即为缩小增量排序,a[i]与a[i+di]比较,di为增量,每一轮比较完成后,di越来越小

数据结构学习小记8(查找+排序1)的评论 (共 条)

分享到微博请遵守国家法律