一、认识堆
堆是一种基本的数据结构。在这里我用数组来形容,在一个二叉堆的数组中,每一个元素都要保证大于等于另外两个特定位置的元素。同时相应的,这些元素又要大于等于另外两个相应位置的元素,整个数据结构以此类推。如果我们将整个数据结构画成树状结构,就能够清晰地看出整个结构的样子。
图一我们称之为大顶堆:大顶堆的特性就是父节点大于或者等于它的左右孩子
图二我们称之为小顶堆:小顶堆的特性和大顶堆相反,就是父节点小于或同于它的左右孩子
下标为i的节点的父节点下标:(i - 1)/ 2[ 整数除法 ]
下标为i的节点的左孩子下标:i * 2 + 1
下表为i的节点的右孩子下标:i * 2 + 2
二、维护堆得性质
就是将无序的堆变成大顶堆或者小顶堆
未排序前
排序后
三、代码实现
#include <stdio.h>
#include <string.h>
#include <strings.h>
int arr[10]={5,6,9,8,4,0,1,2,7,3};
int n = sizeof(arr);
void heapify(int i)//维护堆的性质
{
int largest = i;
int lson = i* 2 + 1;
int rson = i*2 + 2;
if ( lson < n && arr[ largest] < arr[ lson])
largest = lson;
if (rson < n && arr[ largest] <arr[rson])
largest = rson;
if (largest != i)
{
int temp;
temp = arr[largest];
arr[largest] = arr[i];
arr[i] = temp;
heapify(largest);
}
}
//堆排序入口
void heap_sort(void)
{
int i;//建堆
for(i =n/ 2 -1; i >=0; i--)
heapify(i);
//排序
for (i = n - 1; i > 0; i--)
{
int temp;
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
// swap(&arr[i],&arr[0]);
heapify(0);
}
}
int main(int argc,char *argv[])
{
int i=0;//数组的下标
heapify(i);
heap_sort();
int j;
for(j=0;j<10;j++)
{
printf("%d ",j);
}
printf("\n");
return 0;
}