一、堆排序算法基本思想
利用最小堆(最大堆)的数据结构,利用待排序数据,建立最小/大堆每次取走堆顶的元素,然后将堆底的一个最后一个元素,放到堆顶,重整堆成为最小堆,然后再取走堆顶元素,以此类推......直到取完所有元素
二、堆排序的数据结构
堆的数据结构,不懂的可以看我另外一篇介绍最小堆的博客:最小堆
三、排序过程图解
四、算法源代码
#include<cstdio> #define BLANK 100000 //待整理成最小堆的原始数据,下标从1开始,[0]为空 int list[] = {BLANK,49,38,65,97,76,13,27,49}; //最小堆原始数据量 int size = 8; //根据根节点调整子堆 void heapAdjust(int heap[],int s,int t) { //根节点值 int rc = heap[s]; //访问当前根节点的左子节点 for(int i=2*s;i<=t;i*=2) { //如果左子节点大于右子节点,那么根节点和右节点比较 //也就是要在根节点、左子节点、右子节点中找出 //最小的值来替换当前根节点,以满足最小堆的条件 if(i<t&&heap[i]>heap[i+1]) i++; //如果根节点小于左右子节点那么 //说明子最小堆已经建好 if(rc < heap[i]) break; //否则替换根节点 heap[s] = heap[i]; //保留原来根节点值要插入的地方 s = i; } //原来根节点值移动到相应位置 heap[s] = rc; } int main() { //从底部开始建立堆 for(int i= size/2;i>0;i--) heapAdjust(list,i,size); //每次从最小堆顶拿元素和 //末尾数据交换位置 //再次调整堆(1~i-1)结构 //这就是堆排序 for(int i=size;i>=1;i--) { int temp = list[1]; printf("%d\n",temp); list[1] = list[i]; list[i] = temp; heapAdjust(list,1,i-1); } return 0; }