排序算法——堆排序(递归版本)
来源:互联网 发布:linux文件权限修改 编辑:程序博客网 时间:2024/05/29 13:28
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法。堆积树是一个近似完整二叉树的结构,并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父结点。
在堆积树的数据结构中,堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作:
1.最大堆积调整(max_heapify):将堆积树的末端子结点作调整,使得子结点永远小于父结点
2.建立最大堆积(build_max_heap):将堆积树所有数据重新排序
3.堆积排序(heap_sort):移除位在第一个数据的根结点,并做最大堆积调整的递归运算
最坏时间复杂度 O(nlogn)
堆排序是不稳定的排序算法
- #include <stdio.h>
- void max_heapify(int a[], int parent, int heap_size)
- {
- int l, r, largest, temp;
- l = (parent << 1) + 1;
- r = l + 1;
- largest = parent;
- if (l <= heap_size && a[l] > a[largest]) {
- largest = l;
- }
- if (r <= heap_size && a[r] > a[largest]) {
- largest = r;
- }
- if (largest != parent) {
- temp = a[parent];
- a[parent] = a[largest];
- a[largest] = temp;
- max_heapify(a, largest, heap_size);
- }
- }
- void build_max_heap(int a[], int heap_size)
- {
- int i;
- for (i = heap_size / 2; i >= 0; i--) {
- max_heapify(a, i, heap_size);
- }
- }
- void heap_sort(int a[], int heap_size)
- {
- int i, temp;
- build_max_heap(a, heap_size);
- for (i = heap_size; i >= 0; i--)
- {
- temp = a[i];
- a[i] = a[0];
- a[0] = temp;
- heap_size--;
- max_heapify(a, 0, heap_size);
- }
- }
- int main()
- {
- int a[] = {46,79,56,38,40,84}, i;
- int size = sizeof(a) / sizeof(int);
- heap_sort(a, size - 1);
- for (i = 0; i < size; i++) {
- printf("%d ", a[i]);
- }
- return 0;
- }
- 排序算法——堆排序(递归版本)
- 堆排序递归算法
- 排序算法—堆排序
- 重新教自己学算法之递归排序——堆排序(六)
- 排序算法—堆和堆排序
- 堆排序非递归算法
- 堆排序(递归)
- 排序算法——堆排序算法
- 冒泡排序、快速排序(递归&非递归)、堆排序算法比较浅析
- 排序算法——堆排序
- 排序算法——堆排序
- 常用排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 算法——排序之堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法——堆排序
- Set 集合
- Ubuntu安装软件方法
- 《程序员羊皮卷》走进Tech?Ed2009
- java中使用正则表达式(2)
- 刚上初中的时候,老师问我的一道题
- 排序算法——堆排序(递归版本)
- 大学计算机课程学习路线2
- 【第6章】模仿MINIX的中断处理【二】
- 《冒号课堂》连载之九——并发范式:合作与竞争
- 利用Ajax对客户端页面的动态增删改查
- 答案_最大公约数问题
- 在定位中追寻成功
- 运行在浏览器上的操作系统
- 实用程序工具包(用户自制的头文件)