// HeapSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <cstdlib>
#define LIST_MAX_SIZE 100
//顺序表
struct sqList{
int base[LIST_MAX_SIZE];
int len;
};
typedef sqList Heap;//顺序表作为堆排序的基本类型
//初始化顺序表
void initHeap(Heap * list,int * array,int len){
//0号单元不存储.
for (int i = 0; i < len; i++){
list->base[i+1] = array[i];
}
list->len = len;
}
//向下筛选(最小堆)
void siftDown(Heap *h,int i){
int len = h->len;
int minIndex = i;
bool finished = false;//完成标志
for (int j = 2 * i; j <= len && finished == false; j= 2 * i){
if (h->base[j] < h->base[i]){
minIndex = j;
}
if (j + 1 <= len){
if (h->base[j+1] < h->base[minIndex]){
minIndex = j + 1;
}
}
if (minIndex != i){
int temp = h->base[minIndex];
h->base[minIndex] = h->base[i];
h->base[i] = temp;
i = minIndex;
}
else{
finished = true;//完成筛选。
}
}
}
//创建堆
void createHeap(Heap * h){
int len = h->len;
for (int i = len / 2; i >= 1; i--){
siftDown(h,i);
}
printf("---------------创建堆---------------\n");
for (int i = 1; i <= h->len; i++){
printf("%d\t",h->base[i]);
}
printf("\n");
}
void heapSort(Heap h){
printf("---------------堆排序---------------\n");
for (int i = h.len; i >= 1; i--){
printf("%d\t",h.base[1]);
h.base[1] = h.base[i];
h.len--;
siftDown(&h,1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int testArray[10] = {77,66,44,33,11,22,55,99,88,100};
Heap h;
initHeap(&h,testArray,10);
createHeap(&h);
heapSort(h);
return 0;
}
参考网址:http://www.cnblogs.com/ahalei/p/3783543.html
http://www.cnblogs.com/ahalei/p/3792155.html
具体代码解释 看 上面的 两个网址就行了,然后 给 《啊哈磊》 赞 一个。