排序
排序的基本概念
算法的稳定性:若待排序表中有两个元素相等,排序后他俩的顺序保持不变。
判断排序算法好坏的标准是时间复杂度和空间复杂度。
1.插入排序
直接插入排序
折半插入排序
前面有序序列查找插入位置时采用折半查找的方法
希尔排序
不稳定算法
顺序存储
2.交换排序
冒泡排序
快速排序
不稳定、 顺序存储
中心点,pivot:可以是第一个数、最后一个数、最中间一个数、任选一个数等。
每一趟排序都是把一个元素放到最终位置。
方法一:从左往右写的同时从右往左写,最后写中间的值pivot key
方法二:加一个哨兵,low指向第一个,high指向最后一个,将第一个放到哨兵的位置,然后从右边找小的放左边空的,然后从左边找大的放右边,依次交替,直至low=high,将哨兵位置的放到low位置上,第一趟完成,左右子表再递归,直至表中元素就一个元素。
3.选择排序
每一趟循环会把一个元素放到最终位置上。
直接选择排序
不稳定 顺序存储和链式存储
- 通过n-1次关键字比较,从n个记录中找到最小的记录,将它与第一个记录交换。
- 再通过n-2次关键词比较,从剩余的n-1个记录中找出关键字次最小的记录,将它与第二个记录交换。
- 重复上述操作,共进行n-1趟排序后,排序结束。
选最小值的方法类似于打擂台,谁小谁上去。
堆排序
定义:若n个元素的序列{a1,a2…an}满足
- ai ≤ a2i
- ai ≤ a2i+1
小根堆(如果是≥则是大根堆)
由堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点。如图为小根堆。
堆排序定义:
若在输出堆顶的最小(大)值后,是的剩余n-1个得序列又重建一个堆,再取次小(大)值…如此反复,便能找到一个有序序列,这个过程称为堆排序。
堆的调整
小根堆
- 输出堆顶元素后,以堆中最后一个元素替代之。
- 然后将根节点与左右子树的根节点进行比较,并与其中小者进行交换。
- 重复上述操作,直至叶子结点,将得到新的堆,这个过程称为“筛选”。
堆的建立
堆实质上是一个线性表,那么可以顺序存储一个堆。
4.归并和基数排序
归并排序
基数排序
不基于比较,借助“分配”和“收集”两种操作对单逻辑关键字进行排序,分为最高位优先(MSD)和最低位优先(LSD)。
5.内部排序算法的比较和应用
排序算法比较
排序算法应用
- 若n较小(小于50)时,可采用直接插入排序或简单选择排序;若较大时,采用快排、堆排序、归并排序
- 若n很大,记录关键字位数较少且可分解,采用基数排序。
- 若初始基本有序,则采用直接插入或冒泡排序。
- 当记录元素比较大时,应避免大量移动的排序算法,尽量采用链式存储。
6.外部排序
外部排序通常采用归并排序方法
失败数
优化IO次数
置换选择排序
最佳归并树
带权路径长度之和为归并过程中的总读记录数