堆排序算法
来源:互联网 发布: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");
}
//
#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");
}
- 排序算法--堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法-堆排序
- 排序算法---堆排序
- 排序算法--堆排序
- 排序算法----堆排序
- 排序算法--堆排序
- 排序算法 堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 排序算法---堆排序
- 【排序算法】堆排序
- 排序算法:堆排序
- 排序算法-堆排序
- 排序算法:堆排序
- 排序算法-堆排序
- linux下vi编辑器的使用
- MongoDB与CouchDB全方位对比
- 小试libSVM
- 主分量分析(PCA)
- ASCII 、GB2312、GBK、GB18030、unicode、UTF-8字符集编码详解
- 堆排序算法
- web service的基础教程 web Service java
- mybatis在<if>中传入一个简单类型参数的两种写法。
- 推荐一个blog,iOS 绘图的学习 objective-c 绘图资料
- c# delegate 学习2
- C# 4.0新特性(白皮书)中英文完美版(转)
- linux的引导流程grub的配置
- DM642 FVID驱动
- POJ--Eqs