码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2020-02-22 13:45:48      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:插入   并且   打印   namespace   for   ++   存在   heap   delete   

堆相关操作

建堆

向下堆化

向上堆化

删除堆顶(向下堆化)

添加元素(向上堆化)

堆排序

建堆(逆序 向下堆化)

排序(向下堆化)

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?"\n":" ");
    }
}
// 插入元素
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;
}

堆排序

标签:插入   并且   打印   namespace   for   ++   存在   heap   delete   

原文地址:https://www.cnblogs.com/houzm/p/12345019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!