堆排序
堆排序利用了二叉树的结构
二叉树的原理和实现:http://blog.csdn.net/qq_21358401/article/details/79329523
堆排序的大致过程:
1. 排序选出n个数中最大的一个
2. 在剩下的n-1个数中继续排序选最大的一个
3. 知道只剩下一个最小的数
堆
堆排序用到的堆并非不是管理内存的堆栈,这里的堆指的是一种完全二叉树(叶节点
只出现在最下层或次下层).
堆分为大顶堆(根节点的值大于左节点和右节点)和小顶堆(根节点的值小于左节点和右节点).
排序
假设有n个数据
1. 递归调整(将最大值/最小值调整到堆顶)
2. 将堆顶的最大/最小值取出 继续调整排序剩下的n-1个节点
调整
void adjust(int *a, int size, int index) {
int max = index;
int left = index * 2 + 1;
int right = index * 2 + 2;
if (left < size && a[left] < a[max])
max = left;
if (right < size && a[right] < a[max])
max = right;
if (max != index) {
swap(&a[max], &a[index]);
adjust(a, size, max);
}
}
排序
void sort(int *a, int size) {
int i = 0;
for (i = size / 2 - 1; i >= 0; i--) {
adjust(a, size, i);
}
log("heap top:%d", a[0]);
for (i = size -1; i >= 1; i--) {
swap(&a[0], &a[i]);
adjust(a, i, 0);
}
}
参考blog
http://blog.csdn.net/lzuacm/article/details/52853194
示例代码
int main() {
log("heap sort test");
int a[] = {12, 14, 13, 33, 35, 57};
log("sizeof a:%d", array_size(a));
sort(a, 6);
int i = 0;
for (; i < array_size(a); i++) {
log("idx:%d val:%d", i, a[i]);
}
return 0;
}
git repo:
https://github.com/sliver-chen/codingutil/tree/master/algorithm/head_sort