堆排序
Posted houzm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。
堆
堆相关操作
建堆
向下堆化
向上堆化
删除堆顶(向下堆化)
添加元素(向上堆化)
堆排序
建堆(逆序 向下堆化)
排序(向下堆化)
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;
}
以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章