堆和堆排序
来源:互联网 发布:mac srt 字幕乱码 编辑:程序博客网 时间:2024/06/06 03:07
堆的简介
堆排序是一种复杂度为Nlog(N)的排序算法。介绍堆排序之前先讲一讲什么是堆。这里介绍的是数据结构中的二叉堆。
二叉堆是一颗完全二叉树,一般可以直接用数组实现。它的特点:
1. 父节点的键值总是大于等于(或小于等于)任何一个子节点的值。
2. 每一个节点的左右子树都是一个二叉堆。
当父节点的值都大于等于子节点的值,这样的二叉堆叫做大顶堆。当父节点的值都小于等于子节点的值,叫做小顶堆。
堆排序
- 调整堆
void adjust_heap(vector<int> &v, int index, int len) { int max = index; int left = index*2 + 1; int right = index*2 + 2; if (left < len && v[left] > v[max]) max = left; if (right < len && v[right] > v[max]) max = right; if (max != index) { swap(v[max], v[index]); adjust_heap(v, max, len); } }
- 建造堆
void build_heap(vector<int> &v){ int len = v.size(); for (int i = (len - 2)/2; i >= 0;i--) { adjust_heap(v, i , len); } }
- 堆排序
void heap_sort(vector<int> &v){ build_heap(v); for(int i = v.size() - 1;i > 0;i--) { swap(v[0], v[i]); adjust_heap(v, 0, i); }}
- 测试
int main(){ vector<int> v = {4, 2, 7 ,11 , 8 ,10,6}; cout << "befort head_sort..." << endl; for (auto i : v) cout << i << " "; cout << endl; heap_sort(v); cout << "after heap_sort..." << endl; for (auto i : v) cout << i << " "; cout << endl; return 0;}
阅读全文
0 0
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- 堆和堆排序
- ActivityManager 和 内部类 RecentTaskInfo的学习
- redis在spring中的配置及java代码实现
- [算法分析与设计] leetcode 每周一题: Copy List with Random Pointer
- URL与URI
- 关于c语言头文件的编写
- 堆和堆排序
- hashMap--put(k,v)源码分析
- 心急的c小加
- iptables配置
- 【OGRE】Ogre for vs2012安装配置
- git使用总结
- c# 发邮件时发送会议邀请icalendar包括更新以及取消
- 微服务要素-十二要素(The Twelve Factors)
- Hibernate进阶一级缓存