堆排序
来源:互联网 发布:印度gdp超过中国知乎 编辑:程序博客网 时间:2024/06/05 06:54
#include <stdio.h>
// 交换函数
void swap (int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// a 代表一个数组
// i 代表要调整的结点的下标
// len 数组的长度
void heapify(int *a, int i, int len)
{
int left = 2 * i + 1; // 左孩子结点下标
int right = 2 * i + 2; // 右孩子结点下标
int max = i; // 三个节点中最大元素的下标
if (left < len && a[left] > a[max])
max = left;
if (right < len && a[right] > a[max])
max = right;
if (max != i) // 当前父节点不是所有结点中最大的元素,需要做调整
{
swap (a, i, max);
heapify (a, max, len); // 调整被交换的结点
}
}
void heapSort (int *a, int len)
{
// 建堆
int i;
for (i = len/2 - 1; i >= 0; i--)
{
heapify (a, i, len);
}
// 排序
for (i = len-1; i > 0; i--)
{
swap (a, 0, i); // 拿堆顶元素与队尾元素进行交换
len--; // 找到一个最大元素以后堆大小减1
heapify (a, 0, len); // 调整堆顶元素
}
}
int main()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
heapSort(a, len);
printA (a, len);
return 0;
}
// 交换函数
void swap (int a[], int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印数组
void printA (int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// a 代表一个数组
// i 代表要调整的结点的下标
// len 数组的长度
void heapify(int *a, int i, int len)
{
int left = 2 * i + 1; // 左孩子结点下标
int right = 2 * i + 2; // 右孩子结点下标
int max = i; // 三个节点中最大元素的下标
if (left < len && a[left] > a[max])
max = left;
if (right < len && a[right] > a[max])
max = right;
if (max != i) // 当前父节点不是所有结点中最大的元素,需要做调整
{
swap (a, i, max);
heapify (a, max, len); // 调整被交换的结点
}
}
void heapSort (int *a, int len)
{
// 建堆
int i;
for (i = len/2 - 1; i >= 0; i--)
{
heapify (a, i, len);
}
// 排序
for (i = len-1; i > 0; i--)
{
swap (a, 0, i); // 拿堆顶元素与队尾元素进行交换
len--; // 找到一个最大元素以后堆大小减1
heapify (a, 0, len); // 调整堆顶元素
}
}
int main()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
heapSort(a, len);
printA (a, len);
return 0;
}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- mysql_connect和mysql_pconnect的区别
- 百练4084:拓扑排序结题报告
- 字符串及相关函数
- C语言之多级指针
- 模块已加载,但对DllRegisterServer的调用失败,错误代码为0x800......的解决办法
- 堆排序
- PHP构造方法和析构函数
- OC中isKindOfClass和isMemberOfClass的区别
- 网页简单的登出功能
- 在ubuntu14.04下openni+opencv+kinectV1的学习三:手势识别
- MIT神经科学教授James DiCarlo谈如何通过人类神经理解神经网络
- sql查询
- 归并排序
- 十进制转化为十六进制