堆与堆排序

堆是一种特殊的数组,常用于实现优先队列。本文详细介绍了堆的定义、性质,包括大根堆与小根堆的区别。堆排序算法通过建立大根堆,将最大元素逐步移到数组末尾,实现排序。算法主要涉及建堆、调整堆和排序三个关键步骤,其中max_heapify用于确保堆的性质,build_max_heap用于构建初始大根堆,heapSort则完成整个排序过程。

堆数据结构是一种数组对象,相当于一颗完全二叉树,表示堆的数组A有两个属性:length[A]是数组中的元素个数,heap_size[A]是数组中存储的堆的元素个数,就是说A[heap_size]之后的元素不属于堆,规定heap_size[A]<=length[A],树的根为A[0],给定了某个节点的下标i,则其父节点下标parent[i]为(i-1)/2(取整),左孩子下标left[i]=2i+1,有孩子下标right[i]=2(i+1)

 

大根堆(最大堆)与小根堆(最小堆)

大根堆:除根节点外,每个节点都满足A[i]<=parent[i],即根部为最大元素

小根堆:除根节点外,每个节点都满足A[i]>=parent[i],即根部为最小元素

 

在堆排序算法中,使用的是大根堆,小根堆通常在构造优先队列时使用

 

堆排序算法

1:建初始大根堆

2:从最后一个节点(即数组的最后一个元素)开始,交换其与根节点的值,即每次拿出最后一个元素,与根处的元素(即当前最大的元素)互换,但每次交换完两个节点的值之后都应把当前的堆元素数目(heap_size)减一,然后把新堆重新构造成大根堆。然后节点往前走,重复该过程,直到只剩一个节点为止。

 

共需要三个函数

1.使以i为根节点的堆为大根堆的函数

public void max_heapify(int a[],int i){

int l=left(i);

int r=right(i);

int largest;

if(a[l]>a[i])

largest=l;

else

largest=i;

if(a[r]>a[largest])

largest=r;

if(largest!=i) {

int t=a[i];

a[i]=a[largest];

a[largest]=t;

max_heapify(a,largest);

}

}

2.初始建堆函数(自后往前从第一个不是叶子节点的节点开始依次调用构造大根堆的函数)

public void build_max_heap(int a[]) {

heap_size=a.length;

for(int i=a.length/2;i>=0;i--)

max_heapify(a,i);

}

3.堆排序函数

public void heapSort(int a[]) {

build_max_heap(a);

for(int i=a.length-1;i>=1;i--) {

int t=a[i];

a[i]=a[0];

a[0]=t;

heap_size--;

max_heapify(a,0);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值