数据结构_C++堆排序附详解(图解)

附代码如下:
#include< iostream >
using namespace std;
typedef int ElemType;

//堆的初始化—如何将一个序列调整为一个大根堆
//建堆操作

void AdjustDown(ElemType A[], int k, int len)
{
A[0] = A[k];
for (int i = 2 * k; i <= len; i *= 2) {
if (i < len && A[i] < A[i + 1])
i++;
if (A[0] >= A[i])
break;
else {
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void BuildMaxHeap(ElemType A[], int len) {
for (int i = len / 2; i > 0; i–)
AdjustDown(A, i, len);
}
//堆排序 附:时间复杂度O(nlog2 n) 空间复杂度O(1)
void Swap(ElemType A[], int i)
{
cout<<A[1]<<endl;
int x;
x=A[1];
A[1]=A[i];
A[i]=x;
}
void HeapSort(ElemType A[], int len) {
BuildMaxHeap(A, len);
for (int i = len; i > 1; i–) {
Swap(A, i);
AdjustDown(A, 1, i - 1);
}
}

int main()
{
ElemType A[] = { 0,12,19,18,16,14,5,7,9,11,21}; //待排序序列的0号为应该为空
HeapSort(A, 11);
cout << “Waiting…” << endl;
}
以上为堆排序执行代码,详解如下

引入概念大根堆和小根堆

大根堆:第i个节点值大于等于2i和2i+1节点的值
小根堆:第i个节点值小于等于2i和2i+1节点的值
0<i<=len/2
len为该序列长度

算法原理

通过对树中各节点的值进行交换 从而使根节点值为最大 其孩子节点值次之 依次向下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值