堆排序
来源:互联网 发布:jenkins windows安装 编辑:程序博客网 时间:2024/06/01 10:42
当所有的非叶子节点大于等于两个儿子节点的关键字时,这样的堆叫做大顶堆。当所有的非叶子节点小于等于两个儿子节点的关键字时,这样的堆叫做小顶堆。
堆排序:将array[0..n-1]建成一个大顶堆,称为初始堆。将array[0]和array[n-1]互换。由于交换后的array[0]可能违反堆的性质,故将array[0..n-2]再调节成堆。然后再次将array[0]和array[n-2]互换,同样的再将array[0..n-3]调整成堆,直到数组中只剩下一个元素为止。
#include<stdio.h>int count = 1;void Restore(int *array, int i, int n);void HeapSort(int *array, int n) { int i, t; for (i = n / 2; i > 0; i--) Restore(array, i, n); for (i = n - 1; i > 0; i--) { t = *(array + i + 1); *(array + i + 1) = *(array + 1); *(array + 1) = t; Restore(array, 1, i); }}void Restore(int *array, int i, int n) { int j, k, r; int done = 0; k = r = *(array + i); j = 2 * i; while ((j <= n) && (done == 0)) { if (j < n) { if (*(array + j) < *(array + j + 1)) j++; } if (k >= *(array + j)) done = 1; else { *(array + j / 2) = *(array + j); j *= 2; } } *(array + j / 2) = r;}void main() { int i; int array[11] = { 0,23,21,25,42,76,54,82,69,11,3 }; //array[0]不起作用 printf("待排序数组:"); for (i = 1; i < 11; i++) printf("%d ", *(array + i)); getchar(); HeapSort(array, 10); printf("\n堆排序后数组为:"); for (i = 1; i < 11; i++) printf("%d ", *(array + i)); printf("\n\n");}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- freeline的使用
- 推荐一个学习mysql的网站
- jquery笔记-autocomplete
- C/C++十大经典算法之快速排序
- 建议4 TryParse比Parse好
- 堆排序
- 【unity3d-C#学习笔记】C#中的委托和事件
- Servlet的request获取前台json数据
- js和jq的加载顺序
- C#数据库连接
- nth-child的使用
- [IOS APP]小豆子幽默丛书
- yum安装之-安装底层软件库--技术支持TPshop商城
- SCU 4440: Rectangle(规律)