堆排序算法

来源:互联网 发布:c 大量数据导出excel 编辑:程序博客网 时间:2024/06/06 13:09
// HeapSort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>

void BuildHeap(int a[], int count, bool minHeap);
void print(int a[], int count);
void swap (int &a, int &b);
void Rand (int a[], int count, int min, int max);

int _tmain(int argc, _TCHAR* argv[])
{
int a[10];
int count = sizeof(a)/sizeof(a[0]);

//产生10个范围在10~100的随机数,并保存在名为a的数组中
Rand (a, 10, 10, 100);
printf ("Initial array\n");
print(a, count);
for (int i = 0; i < count; i++)
{
//建好小根堆后a[0]元素的值永远是最小的, 反之建立大根堆a[0]永远最大
//之后把a[0]与最后一个元素交换,再在剩下的元素中重新建堆
BuildHeap(a, count - i, false);
printf ("After build heap for the first %d elements\n", count - i);
print(a, count);
swap (a[0], a[count - i - 1]);
}


getchar();
return 0;
}


//产生count个范围在min~max的随机数,并保存在名为a的数组中
void Rand (int *a, int count, int min, int max)
{
srand(unsigned int(time(0)));
int randValue;
int i = 0;
while (i < count)
{
randValue = rand() %max;
if (randValue > min)
{
a[i] = randValue;
i++;
}
}
}


void swap (int &a, int &b)
{
int temp;

temp = a;
a = b;
b = temp;
}


//minHeap - true:建立小堆, false:建立大堆
void BuildHeap(int a[], int count, bool minHeap)
{
//建立小堆(父节点小于等于子节点)
for (int i = 0; i < count; i++)
{
int child = i;
int parent = (child - 1) / 2;
while (parent >= 0 && child != 0)
{
if (minHeap)
{
//如果子节点都比父节点大了,代表已经找到放要插入值的位置,不再与父节点的父节点比
//因为父节点的值肯定是小于子节点的值,小堆特性
if (a[child] > a[parent])  
break;
}
else
{
//如果子节点都比父节点小了,代表已经找到放要插入值的位置,不再与父节点的父节点比
//因为父节点的值肯定是大于或等于子节点的值,大堆特性
if (a[child] < a[parent])
break;
}


//子节点设置为当前父节点的值
swap (a[parent], a[child]);
child = parent;
parent = (child - 1) / 2;
}
}
}


void print(int a[], int count)
{
printf ("values of array from index 0 to %d are: ", count -1);
for (int i = 0; i < count; i++)
{
printf ("%d ", a[i]);
}
printf ("\n");
}
原创粉丝点击