第八章 查找与排序 Search and Sort
8.1查找的基本概念
查找 是在数据集合中寻找满足某种条件的数据元素的过程。关键字是数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。
查找表(查找结构):查找表用于查找的数据集合,它由同一类型的数据元素(或记录)组成。查找表分为静态查找表(仅关注查找速度)和动态查找表(除了查找速度,也要关注插/删操作是否方便实现)。对查找表的常见操作有①查找符合条件的数据元素②插入、删除某个数据元素。
查找算法的评价指标: 查找算法的评价指标是查找长度和平均查找长度。查找长度是指在查找运算中,需要对比关键字的次数称为查找长度。平均查找长度ASL是指所有查找过程中进行关键字的比较次数的平均值。
8.2顺序查找又叫线性查找,通常用于线性表。
算法思想︰从头到 jio 挨个找或者反过来也OK,适用于顺序表和链表。可在0号位置存哨兵。
时间复杂化度O(n)
8.3 折半查找又叫二分查找,仅适用于有序的顺序表。
算法思想:
时间复杂度:O(log2n)
8.4分块查找又称索引顺序查找
算法思想:在索引表中确定待查记录所属的分块(可顺序、可折半),再在块内顺序查找。
查找效率分析ASL=查索引表的平均查找长度+查分块的平均查找长度
一、插入排序
排序(Sort):排序是将各元素按关键字递增或递减顺序重新排列。排序算法分为内部排序(数据都在内存中)和外部排序(数据太多,无法全部放入内存)。
排序算法的评价指标:时间复杂度、空间复杂度、算法的稳定性。
算法的稳定性:关键字相同的元素在排序之后相对位置是否会发生改变。
插入排序的算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。插入排序分为直接插入排序和折半插入排序。直接插入排序是顺序查找找到插入的位置,适用于顺序表、链表。折半插入排序是折半查找找到应插入的位置,仅适用于顺序表。
算法效率分析:
空间复杂度: 0(1)
最好时间复杂度(原本有序) : O(n)
最坏时间复杂度(原本逆序) : O(n的2次方)
平均时间复杂度( O(n的2次方)
算法稳定性:稳定
二、希尔排序
算法思想:适用于顺序表。
算法效率分析:
空间复杂度: 0(1)
时间复杂度:未知,但优于直接插入排序
算法稳定性:不稳定
三、冒泡排序
冒泡排序算法思想:从后往前或从前往后两两比较相邻元素的值,若为逆序则交换它们,直到序列比较完,称这样过程为“一趟”冒泡排序。最多只需要n-1趟排序。每一趟排序都可以使一个元素的移动到最终位置,已经确定最终位置的元素在之后的处理中无需再对比。如果某一趟排序过程中未发生交换则算法可提前结束。适用于顺序表和链表。
算法性能分析:
空间复杂度O(1)
最好时间复杂度(有序)O(n)
最坏时间复杂度(逆序)O(n的平方)
平均时间复杂度O(n的平方)
稳定性:稳定。
四、快速排序
算法思想:
算法性能分析:
最好空间复杂度O(n)
最坏空间复杂度O(logn)
最好时间复杂度O(n的平方)每次划分很平均
最坏时间复杂度O(nlogn) 原本逆或正序
平均时间复杂度O(nlogn)
稳定性:不稳定
五、简单选择排序
算法思想:适用于顺序表和链表。
算法性能分析:
空间复杂度O(1)
时间复杂度O(n的平方)
稳定性:不稳定。
六、堆排序
算法思想:
算法性能分析:
空间复杂度O(1)
时间复杂度O(nlog平方n)
稳定性:不稳定。