查找
一、顺序查找:从线性表的第一个元素开始,逐个将线性表的元素与被查元素比较。在平均情况下,大约需要比较n/2次
特殊情况:
①线性表是无序表,不管是顺序存储结构还是链式存储结构,都只能用顺序查找
②线性表是有序的,如果采用链式存储结构,只能用顺序查找
二、二分法查找
- 线性表条件:
①用顺序存储结构;
②线性表是有序表(元素按非递减排列);
与中间项比较。最多比log2(n)次
排序
排序:将一个无序序列整理为按值非递减顺序排序的一种方式
逆序:序列中,如果某个元素其后存在一个元素小于它,则称存在一个逆序
1.交换类排序法
①冒泡排序法
- 基本思想:通过两两相邻数据元素之间的比较与交换,不断地消除逆序(最多比较次数:
n(n-1)/2
)
②快速排序
- 基本思想:取一个元素
K
(通常第一个),以K作为分割标准,把小于(大于)K的元素移在K的前面(后面)。于是,线性表分割为两个子表,再对俩个子表分别重复以上操作,直到分割的子表长度为1。
最多比较次数:
n(n-1)/2
,但实际情况下排序效率要比冒泡排序高很
多
2、插入类排序法
插入排序:按元素值的大小插在已排好的子表中的适当位置,直到全部元素插入完成为止
①简单插入排序
- 基本思想:把n个元素看成是一个有序表和一个无序表。开始,有序表里只有一个元素,无序表里有n-1个;取无序表的第一个元素插入有序表的恰当位置,生成新的有序表。(最多比较次数:
n(n-1)/2
)
插入元素时,插入位置及其后的记录依次往后移动,最终使有序表的长度为n,无序为0
②希尔排序
- 基本思想:先取一个
增量d1
,把全部数据元素分为d1组,所有距离为d1倍数的元素在一组,形成一个子序列,对每个子序列进行简单插入排序。然后取d2(<d1)
,对整个新序列重复上述操作,直至di=1
(即所有记录在一组)
该排序效率与所选的增量序列有关(最多比较次数:
n^r(1< r <2)
)
三、选择类排序法
选择排序:通过每一趟从排序序列中选出最小的元素,顺序放在一排好的有序子表的后面。
①简单选择排序
- 基本思想:先从所有待排序的数据元素中选择最小的元素,将该元素与第一个元素交换,再从剩下的n-1个元素里选择最小的元素与第二个元素交换。重复上述操作直至所有元素有序为止。(最多比较次数:
n(n-1)/2
)
②堆排序法
若有n个元素的序列(h1, h2,...., hn)
,将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件(下面两个灰条)的称为堆。
分类:
①大根堆:所有节点的值大于或等于左右节点的值
hi ≥ h2i & hi ≤ h2i+1
②小根堆:所有节点的值小于或等于左右节点的值
hi ≤ h2i & hi ≥ h2i+1
(最多比较次数:nlog2(n)
)