博客
关于我
算法训练——排序问题解析
阅读量:797 次
发布时间:2023-03-29

本文共 1508 字,大约阅读时间需要 5 分钟。

排序算法原理与实现

摘要

在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文将简单介绍常见的七种查找算法,其中二分查找、插值查找及斐波那契查找都属于插值查找的一种优化。插值查找和斐波那契查找是在二分查找的基础上提出的优化算法。

一、排序算法原理与解题方法

1.1 查找定义

查找是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

1.2 查找算法分类

查找算法可以分为静态查找和动态查找,或者无序查找和有序查找。动态查找表指的是查找表中有删除和插入操作的表。无序查找适用于被查找数列有序无序均可,而有序查找则要求被查找数列必须为有序数列。

1.3 平均查找长度(ASL)

平均查找长度(ASL)是指在查找成功时,与指定key比较的关键字个数的期望值。对于含有n个数据元素的查找表,ASL=Pi*Ci的和,其中Pi是查找表中第i个数据元素的概率,Ci是找到第i个数据元素时已经比较过的次数。


2. 顺序查找

基本思想

顺序查找也称为线形查找,是无序查找算法的一种。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k比较,若相等则查找成功;若扫描结束仍未找到,则查找失败。

复杂度分析

查找成功时的平均查找长度为(n+1)/2,时间复杂度为O(n)。


3. 二分查找

基本思想

二分查找是一种有序查找算法,通过将有序表分成两部分,逐步缩小查找范围。具体步骤是:用给定值k与中间结点的关键字比较,若相等则查找成功;若不相等,则根据比较结果确定下一步查找哪个子表,直到查找到或查找结束。

复杂度分析

最坏情况下,比较次数为log2(n+1),期望时间复杂度为O(log2n)。


4. 插值查找

基本思想

插值查找是在二分查找的基础上提出的优化算法。通过计算查找点的比例参数,使其更接近目标值,从而减少比较次数。插值查找适用于表长较大且关键字分布较均匀的情况。

复杂度分析

查找成功或失败的时间复杂度均为O(log2(log2n))。


5. 斐波那契查找

基本思想

斐波那契查找是一种改进的二分查找算法,利用斐波那契数列的黄金比例特性来确定查找点。查找过程分为三种情况:等于、大于和小于,分别调整查找范围。

复杂度分析

时间复杂度为O(log2n),期望复杂度也为O(log2n)。


6. 树表查找

基本思想

树表查找以二叉查找树为基础,通过递归比较每个节点的值来确定查找方向。二叉查找树的性质是左子树值小于右子树值,中序遍历可得到有序数列。

复杂度分析

插入和查找的时间复杂度均为O(logn),但最坏情况下仍为O(n)。


7. 分块查找

基本思想

分块查找将数据分为若干块,块与块之间按顺序排列。查找时首先在块间进行二分查找,确定目标块,再在块内进行顺序查找。

复杂度分析

时间复杂度为O((logm + logn) + n/m),其中m为块数,n为数据元素个数。


8. 哈希查找

基本思想

哈希查找通过将记录的关键字映射到数组索引上,直接访问即可找到目标记录。常见的冲突处理方法有拉链法和线性探测法。

复杂度分析

无冲突情况下,查找时间复杂度为O(1),空间复杂度为O(n)。


2.1 数组中重复的数字

通过哈希表或数组的排序遍历找到重复的数字,时间复杂度为O(n)。


2.2 数组中的逆序对

使用归并排序统计逆序对个数,时间复杂度为O(n logn)。


2.3 最小的K个数

利用归并排序或优先队列获取最小的K个数,时间复杂度为O(n logn)。


2.4 数据流中的中位数

使用两堆(大顶堆和小顶堆)来维护数据流中的中位数,时间复杂度为O(n)。

转载地址:http://bmhfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现extended euclidean algorithm扩展欧几里得算法(附完整源码)
查看>>
Objective-C实现Factorial digit sum阶乘数字和算法(附完整源码)
查看>>
Objective-C实现factorial iterative阶乘迭代算法(附完整源码)
查看>>
Objective-C实现factorial recursive阶乘递归算法(附完整源码)
查看>>
Objective-C实现FigurateNumber垛积数算法(附完整源码)
查看>>
Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
查看>>
Objective-C实现hamiltonianCycle哈密尔顿图算法(附完整源码)
查看>>
Objective-C实现hamming numbers汉明数算法(附完整源码)
查看>>
Objective-C实现hanning 窗(附完整源码)
查看>>
Objective-C实现hanoiTower汉诺塔算法(附完整源码)
查看>>
Objective-C实现hardy ramanujana定理算法(附完整源码)
查看>>
Objective-C实现highest response ratio next高响应比优先调度算法(附完整源码)
查看>>
Objective-C实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)
查看>>
Objective-C实现hornerMethod霍纳法算法(附完整源码)
查看>>
Objective-C实现Http Post请求(附完整源码)
查看>>
Objective-C实现Http协议下载文件(附完整源码)
查看>>
Objective-C实现IIR 滤波器算法(附完整源码)
查看>>
Objective-C实现IIR数字滤波器(附完整源码)
查看>>
Objective-C实现insertion sort插入排序算法(附完整源码)
查看>>
Objective-C实现integer partition整数分区算法(附完整源码)
查看>>