标签:
一、堆排序 (Heap sort)
定义: 完全二叉树的非终端节点的值均不大于(不小于)子节点的值
存储结构: 数组 | vector
逻辑结构: 完全二叉树
性质:
a. 节点编号 0...n-1
b. 节点i, 左字节点= 2*i+1, 右子节点 = 2*i + 2;
c. 最后一个非终端节点:n/2 - 1 (n为节点的个数)
要分析的问题:
1)如何由无序数组建立一个堆
for i = n/2 -1, n>=0; i-- heap_adjust(heap,i,n); //向下调整当前i为根的树,从最后一个非终端节点开始
2)输出堆顶元素后如何继续调整剩余的堆
heap[0]= heap[n-1]; adjust(heap,0,n-1); //从顶点向下开始调整
关键: heap_adjust (swift_down)向下调整函数
c语言实现
#include <stdio.h>
//从 1开始计数的最小堆
void heap_adjust(int heap[], int i,int len)
{
#if 0
//递归实现
int l = 2 * i + 1;
int r = l + 1;
int min = i;
if(l < len && heap[l] < heap[i]) min = l;
if(r < len && heap[r] < heap[min]) min = r;
if(min != i)
{
int tmp = heap[min];
heap[min] = heap[i];
heap[i] = tmp;
heap_adjust(heap,min,len);
}
#else
//非递归实现
int tmp = heap[i]; //暂时存储
int min; //记录交换的节点
for(int k=i; k<len;)
{
int l = k * 2 + 1;
int r = l + 1;
min = k;
if(l < len && heap[l] < heap[k]) min = l;
if(r < len && heap[r] < heap[min]) min = k;
if(min == k) break;
heap[k] = heap[min];
k = min;
}
heap[min] = tmp;
#endif
}
void build_heap(int heap[], int len)
{
for(int k = len/2-1; k >= 0; k--)
{
heap_adjust(heap,k,len);
}
}
void heap_sort(int heap[] ,int len)
{
build_heap(heap, len);
for(int i=len-1; i>0; i--){
printf("%d->%d.\n",len-i,heap[0]);
heap[0] = heap[i];
heap_adjust(heap,0,i);
}
}
int main()
{
int arr[] = {96,85,53,47,56,38,36,12,24};
heap_sort(arr,9);
//build_heap(arr,9);
return 0;
}
标签:
原文地址:http://my.oschina.net/u/573270/blog/476206