堆排序

堆相关操作

建堆

向下堆化

向上堆化

删除堆顶(向下堆化)

添加元素(向上堆化)

堆排序

建堆(逆序 向下堆化)

排序(向下堆化)

Code

#include <iostream>
using namespace std;
const int maxn=100;
int arr[maxn]= {5,2,6,7,4,3,0,9,8,1};
int len =10;
//向下堆化
void downAjust(int low,int heigh) {
	int i=low,j=low*2+1;
	while(j<=heigh) {
		if(j+1<=heigh&&arr[j]<arr[j+1])j=j+1; //若右子节点存在,并且大于左子节点
		if(arr[i]>arr[j])break;
		else {
			swap(arr[i],arr[j]);
			i=j;
			j=2*i+1;
		}
	}
}
//向上堆化
void upAjust(int low,int high) {
	int i=high,j=(i-1)/2;
	while(j>=low&&i>0) {
		if(arr[i]<arr[j])break;//父节点权值大于子节点权值
		else {
			swap(arr[i],arr[j]);
			i=j;
			j=(i-1)/2;
		}
	}
}
//建堆
void heap() {
	for(int i=(len-1)/2; i>=0; i--)
		downAjust(i,len-1); //向下调整
}
// 堆排序
void heap_sort() {
	for(int i=len-1; i>=1; i--) {
		swap(arr[i],arr[0]); //最后一个节点与堆顶交换
		downAjust(0,i-1); //堆顶向下堆化
	}
}
// 打印堆
void print_heap() {
	for(int i=0; i<len; i++) {
		printf("%d",arr[i]);
		printf("%s",i==len-1?"
":" ");
	}
}
// 插入元素
void insert(int v) {
	arr[len++]=v;
	upAjust(0,len-1);
}
// 删除堆顶
void delete_top(){
	swap(arr[0],arr[--len]);
	downAjust(0,len-1);	 
} 
int main(int argc,char *argv[]) {
	heap();
	// 堆排序
//	print_heap();
//	heap_sort();
//	print_heap();


	// 插入元素
//	print_heap();
//	insert(10);
//	print_heap();

	// 删除元素
//	print_heap();
//	delete_top();
//	print_heap();

	return 0;
}
原文地址:https://www.cnblogs.com/houzm/p/12345019.html