堆排序与稳定性

堆排序是一种不稳定的排序算法,其时间复杂度为O(n log n)。建堆过程耗时O(n),通过不断交换堆顶元素实现排序。稳定性在某些业务场景中至关重要,例如冒泡排序、插入排序和归并排序都是稳定的,而选择排序、堆排序和快速排序则不具备这一特性。在实际工程中,根据数据类型和稳定性需求,可以选择快速排序(基础类型)或归并排序(自定义结构且需稳定性),对于小规模数据,插入排序也是高效的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序

时间复杂度O(nlogn)空间复杂度O(1)

  1. 把数组中的元素插入到大根堆,大根堆只保证堆顶元素为最大值,但是整体不保证有序。
  2. 把堆顶元素与最后一个元素交换,同时堆长度heapsize减一
  3. 把交换过后的0到heapsize的元素大根堆化,再重复第二步,直到heapsize的元素为1

建堆

  • 建立堆的时间复杂度O(n)
  1. heapsert函数是用来建立插入元素同时保证大根堆结构,
    当前值从最后一个位置开始,每次与父节点比较大小,如果当前值比父节点大,则交换父节点直到当前值小于等于父节点。父节点为(index-1)//2
  2. heapify函数是用来把当前长度内的元素大根堆化
    当前值从根开始,每次与左右孩子中的较大值做交换,当当前没有做交换时则停止。
    左孩子为2index+1,右孩子为2index+2
def heapSort(arr):
    for i in range(len(arr)):
        heapInsert(arr, i) #先把所有值插入到大根堆中
    heapsize = len(arr)
    heapsize = heapsize -1
    swap(arr,0,heapsize) #把堆顶最大值换到数组末尾
    while heapsize > 0
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值