选择排序
选择排序(Selection Sort)的基本思想是:第i趟在剩余的n-i+1中选择第i小的记录。其中最简单的事简单选择排序(Simple Selection Sort)。
一、 简单选择排序:
如上文所述。
Void SelectionSort(intL[])
{
For(i=1; I < L.length; ++i)
{
J = 从i到L.length中选择最小的记录的位置
If(i!=j)
L[i]=L[j];
}
}
由上图可知,选择排序的主要操作在于比较,而不在于移动数据,所以优化方面主要应该减少比较次数,利用前n-1次的比较信息,就能有效地优化算法。
二、树形选择排序
从体育锦标赛中获得灵感,如果在体育比赛中有三名参赛选手A、B、C、D,想要决出名次的话,需要进行三场比赛而非六场,没有必要A与B\C\D都决出胜负,如果在决赛中A战胜了D,即便A没有与C战斗,那么也可以认为A是比C强的。
所以树形选择排序(Tree Selection Sort)又称为锦标赛排序(Tournament Sort),根节点是最小的节点。
建立一颗log2n+1的完全二叉树,进行深度次的比较,所以时间复杂度为O(nlogn)
三、堆排序
HeapSort需要记录一个记录大小的辅助空间。
在一个长为n的的数组内,满足第i个记录小于等于第2i和第(2i+1)个记录,则成为最小堆,反之称为最大堆。
数组首个记录为最小值,由于为完全二叉树,所以每个父节点必有两个子节点。
堆排序对记录数比较少的文件不值得提倡,时间花费主要在建立初始堆和调整新堆时的反复筛选上,所以在最坏的情况下,时间复杂度也为O(nlogn),这是相对于快速排序来说,最大的优点。