选择类排序基本思想:每一趟在n-i+1(i=1,2,...n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
1.简单选择排序
void SelectSort(RecordType r[ ],int n) //对记录数组r做简单选择排序,n为数组长度
{
for(i=1;i<=n-1;++i)
{
k=i;
for(j=i+1;j<=n;++j)
{
if(r[j].key < r[k].key) k=j;
}
if(k != i)
{ x=r[i]; r[i]=r[k]; r[k]=x; }
}
}
时间复杂度:O(n2) 最好:O(n2) 最坏O(n2) 空间复杂度O(1)
2.树形选择排序
算法改进要点:在简单选择排序中,首先从n个记录中选择关键字最小的记录需要n-1次比较,在n-1个记录中选择关键字最小的记录需要n-2次比较,.....,每次都没有利用上次比较的结果,所以比较操作的时间复杂度为O(n2),欲降低比较的次数,则需要吧比较过程中的大小关系保存下来。
3.堆排序
算法改进要点:弥补树形选择排序占用空间多的遗憾,采用堆排序时,只需要一个记录大小的辅助空间。堆排序是在排序过程中,将向量中存储的数据看成一颗完全二叉树,利用完全二叉树中的双亲结点和孩子节点之间的内在关系来选择关键字最小的记录,即待排序记录仍采用向量数组方式存储,并非采用树的存储结构,而仅仅是采用完全二叉树的顺序结构的特性进行分析
堆定义:称各节点的关键字值满足条件:r[i].key >= r[2i].key 并且 r[i].key >= r[2i+1].key(i=1,2,...,[n/2])的完全二叉树为大根堆。
反之,如果这颗完全二叉树中任意节点的关键字小于或等于其左孩子和右孩子的关键字(当有左孩子和右孩子时),对应的堆为小根堆。
堆排序二个问题:1 按堆定义建初堆 2 去掉最大元素之后重建堆,得到次大元,以此类推
时间复杂度:O(nlog2n) 最好:O(nlog2n) 最坏O(nlog2n) 空间复杂度O(1) 不稳定排序
归并排序:
基本思想:基于合并,将两个或两个以上有序列表合成一个新的有序表
时间复杂度:O(nlog2n) 最好:O(nlog2n) 最坏O(nlog2n) 空间复杂度O(n) 稳定排序