码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-03 09:19:53      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:堆排序

// 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

具体代码解释 看 上面的 两个网址就行了,然后 给 《啊哈磊》 赞 一个。

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

标签:堆排序

原文地址:http://blog.csdn.net/fuming0210sc/article/details/45444743

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!