堆排序算法

github 地址:https://github.com/ImTangYun/comprehensive/blob/master/C%2B%2B/algorithm/heap_sort/heap_sort.cpp

// heapsort.cpp : 定义控制台应用程序的入口点。


#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;

int left(int root){//求节点左节点
 return 2*root + 1;
}

int right(int root){//求右节点
 return 2*root + 2;
}

int parent(int child){//求父节点
 return (child-1)/2;
}

void heapify(int *a,int node,int heap_size){//调整节点使其满足堆得性质
 int l = left(node);
 int r = right(node);
 int largest = node;
 /*从left right node中选最大的节点作为根节点,如果根节点与孩子节点有过交换过程,就递归的对于其进行交换过程的孩子进行调整*/
 if(a[l] > a[largest]&&l < heap_size){
  largest = l;
 }
 if(a[r] > a[largest]&&l < heap_size){
  largest = r; 
 }
 if(largest != node){
  int temp = a[largest];
  a[largest] = a[node];
  a[node] = temp;
  heapify(a,largest,heap_size);
 }
}

void build_max_heap(int *a,int heap_size){//构造最大堆
 for(int i = (heap_size-1)/2;i >=0;--i ){
  heapify(a,i,heap_size);
 }
}

void heap_sort(int *a,int length){//堆排序算法
 build_max_heap(a,length);
 int temp = 0;
 for(int i = length-1;i >=0;--i){//每次通过调整将最大值放到a[0],然后和末尾数字交换,在调整重复至数组有序
  swap(a[0],a[i]);
  heapify(a,0,i-1);
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 int a[] = {2,3,4,456,64,4,5,1,5,8};
 heap_sort(a,10);

 for(int i = 0;i < 10;++i){
  cout<<a[i]<<" ";
 }
 while(1);
 return 0;
}

原文地址:https://www.cnblogs.com/candycloud/p/3347379.html