数据结构排序——插入选择堆冒泡快速归并基数
排序
各种方法的复杂度表
直接插入排序
初始可认为文件中的第1个记录己排好序,然后将第2个到第n个记录依次插入已排序的记录组成的文件中。在对第i个记录Ri进行插入时,R1,R2,…,Ri-1已排序,将记录Ri的排序码keyi与已经排好序的排序码从右向左依次比较,找到Ri应插入的位置,将该位置以后直到Ri-1各记录顺序后移。
哨兵r[0]存放上一次插入的数。
折半插入排序
根据插入排序的基本思想,在找第i个记录的插入位置时,前i-1个记录已排序,将第i个记录的排序码key[i]和已排序的前i-1个的中间位置记录的排序码进行比较,如果key[i]小于中间位置记录排序码,则可以在前半部继续使用二分法查找,否则在后半部继续使用二分法查找,直到查找范围为空,即可确定key[i]的插入位置。
2-路插入排序
希尔排序
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序
快速排序
附设两个指针low和high,初值分别指向第一个记录和最后一个记录,设枢轴为 key;
(1)从high 所指位置起向前搜索,找到第一个不大于基准值的记录与枢轴记录相互交换;
(2)从low 所指位置起向后搜索,找到第一个不小于基准值的记录与枢轴记录相互交换。
(3)重复这两步直至low=high为止。
选择排序
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
堆排序
堆是一个完全二叉树;
堆中每个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。
堆化:
因为叶子节点是不需要堆化的,所以需要堆化的节点从倒数第二层开始。每个节点堆化的过程中,需要比较和交换的节点个数,跟这个节点的高度 k 成正比。
大顶堆的删除堆顶元素:
我们把最后一个节点放到堆顶,然后利用同样的父子节点对比方法。对于不满足父子节点大小关系的,互换两个节点,并且重复这个过程,直到父子节点之间满足大小关系为止。这就是从上往下的堆化方法。
归并排序
基数排序
起泡排序
起泡排序
for (i = 0; i < 9; i++) // 10个数,10 - 1轮冒泡,每一轮都将当前最大的数推到最后
{
for (j = 0; j < 9 - i; j++) // 9 - i,意思是每当经过一轮冒泡后,就减少一次比较