您的位置:首页 > 理论基础 > 数据结构算法

看数据结构写代码(63) 堆排序

2015-05-02 23:28 218 查看
// 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

具体代码解释 看 上面的 两个网址就行了,然后 给 《啊哈磊》 赞 一个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序