常用查找、排序算小结

查找算法比较:

查找方法 算法描述 (ASL 平均查找长度)
顺序查找

从表的一端开始,逐个比较记录的关键与给定值,直到找到返回。ASL=\frac{n+1}{2}

折半查找

列表list已经排号顺序,将待查值key与表中间位置(mid)值比较,若相等则成功,

如key>list[mid]则在后半个子表mid+1~n中查找,如key<list[mid],则在前半个子表1~mid-1中查找,

直到查找成功为止。ASL=\frac{(n+1)}{n}log{_{2}}(n+1)-1

分块查找

将表分为若干块,子块内部不一定有序,但子块间有序。再建立一个索引表,索引表关键字有序。

查找分两步:一、在索引表中找到待查数据所在块,二、在块内顺序查找。长度为n的表,

分为b块,每块s个记录。ASL=\frac{1}{2}(\frac{n}{s}+s)+1,  s=\sqrt{n} ,ASL _{min}^=\sqrt{n}+1;

二叉树查找 二叉排序树(左孩=小,中父=中,右孩=大),构建,删除,调整(平衡二叉树)。
Hash表查找

常用Hash构造方法:直接地址法、数字分析法、平方取中法、折叠法,随机数法、除留余法。

Hash 处理冲突处理方法:

开放定址法: H{_{i}}=H(key)+d{_{i}}\%m , i=1,2,..k(k\leqslant m-1)  , m为Hash表长度,d{_{i}} 为增长序列,

常见增长序列d{_{i}}有3种:

    d_{i}=1,2...m-1

    d_{i}=1^{^{2}},-1^{^{2}},2^{^{2}},-2^{^{2}}...\pm k^{2}

    d{_{i}}=伪随机数序列

 链地址法:在Hash表每个记录中再增加一个链域,存放下一个具有相同Hash值的记录的地址。

排序算法比较:

排序方法 算法描述 时间复杂度 辅助空间 稳定性 使用场合
直接插入

插入第i个记录前,R{{_{i}}~R{{_{i-1}}已经排好序了。

R{{_{i}}依次和 R{_{i-1}},R{_{i-2}}...R{_{1}}比较,

从而找到插入的位置,

插入后其后面的记录依次后移。

O(n^{2}) O(1) 稳定

记录数

较小,

基本有序

简单选择

第i个记录,通过再i+1到n找到

第i个最小(最大)的关键字,和位置i交换。

O(n^{2}) O(1) 不稳定

记录数

较小

冒泡排序 进行 n-1 趟,每趟进行两两交换排序 O(n^{2}) O(1) 稳定 基本有序
希尔排序

直接排序的改进。将记录分成若干子序列,

然后分别进行插入排序,待整个序列中的

记录基本有序,再全体进行一次插入排序。

O(n^{1.3})

O(1) 不稳定

记录数

较大

快速排序

先经一次快速排序将记录分成前半区和后半区

,前半区小于后半区,

然后对这两组继续进行快速排序。

O(nlogn)

O(logn) 不稳定

记录数

较大

堆排序

对记录按堆排成一个序列,

从而输出堆顶记录,

然后将剩余记录排成新堆,得到堆顶记录,

如此反复。 堆定义:

R{_{i}}\leqslant R{_{2i}}, R{_{i}}\leqslant R{_{2i+1}} 或

R{_{i}}\geqslant R{_{2i}}, R{_{i}}\geqslant R{_{2i+1}}

O(nlogn) O(1) 不稳定

记录数

较大

归并排序

将两个或两个以上的有序文件

合并成一个新的有序文件。

O(nlogn) O(n) 稳定

记录数

较大

基数排序

按组成关键字的各个数位值进行排序,

它时分配排序的一种。

将一个关键字K{_{i}} 看成一个d元组,

即:K_{i}^{1},K_{i}^{2}..K_{i}^{j}..K_{i}^{d},其中0\leqslant K_{i}^{j}< r,i=1~n。

O(d(n+rd)) O(nd) 稳定

记录数

较大,

关键字

位数少

发布了4 篇原创文章 · 获赞 1 · 访问量 161

猜你喜欢

转载自blog.csdn.net/h_13611950639/article/details/105253371