堆原理与c实现
来源:互联网 发布:大数据开发工程师招聘 编辑:程序博客网 时间:2024/06/07 06:03
先明白原理后看实现
一、堆原理
转载自https://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html
堆排序在最坏的情况下,其时间复杂度也为O(nlogn)
注:
如果根结点是从1开始,则左右孩子结点分别是2i和2i+1。
如果根结点是从0开始,则左右孩子结点分别是2i+1和2i+2,数组是以0开始的,所以一般使用这个!
二、实现与测试
#include <stdio.h> #include <stdlib.h> /* 堆排序(heap_sort)*/ /* 堆调整,构建大顶堆,arr[]是待调整的数组,i是待调整的数组 元素的位置,length是数组的长度 */ void heap_adjust(int arr[], int i, int length) { int child; int temp; while (2 * i + 1 < length) { /* 子节点的位置 = 2 * (parent(父结点)) + 1 */ child = 2 * i + 1; /* 得到子结点中较大的结点 */ if(child < length - 1 && arr[child + 1] > arr[child]){ child++; } /* 如果较大的子结点大于父结点那么把较大的子结点往上移动替换它的父结点 */ if(arr[i] < arr[child]) {/* 此节点和自己的子节点数据进行交换,就必须进继续比较后代节点*/ temp = arr[i]; arr[i] = arr[child]; arr[child] = temp; i = child; }else {/*没有交换的话 就不对子节点做比较*/ break; } } } /* 堆排序算法 */ void heap_sort(int arr[], int length) { int i; /* 调整序列的前半部分元素,调整完之后第一个元素 是序列的最大元素,length/2-1是最后一个非叶子结点 */ for(i = length/2 - 1; i >= 0; --i) { heap_adjust(arr, i, length); } /* 从最后一个元素开始对序列进行调整,不断的缩小调整 的范围直到第一个元素 循环里是把第一个元素和当前的最后一个元素交换 保证当前的最后一个位置的元素是现在这个序列的最大的 不断的缩小调整heap的范围,每一次调整完毕保证第一个 元素是当前序列的最大的元素 */ for(i = length - 1; i > 0; --i) { arr[i] = arr[0]^arr[i]; /* 交换的一种实现 */ arr[0] = arr[0]^arr[i]; arr[i] = arr[0]^arr[i]; heap_adjust(arr, 0, i); /* 递归调整 */ } } int main() { int i; int num[] = {98, 48, 777, 63, 57, 433, 23, 1112, 1}; printf("sort before : "); for(i = 0; i < sizeof(num)/sizeof(int); i++) { printf("%d ", num[i]); } printf("\n"); heap_sort(num, sizeof(num)/sizeof(int)); printf("sort after : "); for(i = 0; i < sizeof(num)/sizeof(int); i++) { printf("%d ", num[i]); } printf("\n"); return 0; }
阅读全文
0 0
- 堆原理与c实现
- 堆排序 原理与实现
- 堆排序原理及c语言实现
- 堆排序原理及其实现(C++)
- 堆排序算法原理与实现
- 堆结构(一) - 二叉堆的原理与实现
- 堆结构(二) - 左倾堆的原理与实现
- 堆结构(三) - 斜堆的原理与实现
- 堆与堆排序原理及代码实现
- 堆排序原理简述及C实现实例
- C/C++堆排序原理
- 堆 C语言实现
- 堆算法C实现
- 最大堆(c++)实现
- 【c++】模拟实现堆
- C 算法精介----堆->分析与实现
- 数据结构与算是:C++实现堆排序
- 算法与数据结构-堆的基本操作C语言实现
- 常用默认端口号
- 关于CefSharp的坎坷之路
- 2017-11-10
- 数据结构与算法分析后缀变中缀
- vim
- 堆原理与c实现
- Spring boot 十四 读取 .properties 配置
- Email 组件Aspose.Email V17.11发布 | 附下载
- Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
- eclipse创建Maven项目报依赖错误的解决方案
- 11月14日练习与心得
- g++中使用std map根据value查找find_if
- OpenCV图像像素读取及效率分析
- Tensorflow中Tensor类型解析