交换排序之堆排序

选择排序

 

选择排序(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),这是相对于快速排序来说,最大的优点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值