简单选择排序(Simple Selection Sort ,又称为直接选择排序)的基本操作是:通过n-i次关键字间的比较,从n-i+1个记录中选取关键字最小的记录,然后和第i个记录进行交换,i=1, 2, … n-1 。
1 排序示例
例:设有关键字序列为:7, 4, -2, 19, 13, 6,直接选择排序的过程如下图10-8所示。
2 算法实现
void simple_selection_sort(Sqlist *L)
{
int m, n , k;
for (m=1; m<L->length; m++)
{
k=m ;
for (n=m+1; n<=L->length; n++)
if ( LT(L->R[n].key, L->R[k].key) ) k=n ;
if (k!=m) /* 记录交换 */
{
L->R[0]=L->R[m];
L->R[m]=L->R[k];
L->R[k]=L->R[0];
}
}
}
时间复杂度是:T(n)=O(n2)
空间复杂度是:S(n)=O(1)
从排序的稳定性来看,直接选择排序是不稳定的。
树形选择排序
首先对n个记录的关键字两两进行比较,选取én/2ù个较小者;然后这én/2ù个较小者两两进行比较,选取én/4ù个较小者… 如此重复,直到只剩1个关键字为止。
该过程可用一棵有n个叶子结点的完全二叉树表示,如图10-9所示。
每个枝结点的关键字都等于其左、右孩子结点中较小的关键字,根结点的关键字就是最小的关键字。
输出最小关键字后,根据关系的可传递性,欲选取次小关键字,只需将叶子结点中的最小关键字改为“最大值” ,然后重复上述步骤即可。
含有n个叶子结点的完全二叉树的深度为é㏒2nù+1,则总的时间复杂度为O(n㏒2n) 。