堆排序
来源:互联网 发布:阿里云服务器ip地址 编辑:程序博客网 时间:2024/06/01 14:37
- 堆数据结构是一个完全二叉树,父结点值都大于子结点值(都小于子结点值)。
- 用数组表示堆(0,...,size-1),根节点的下标为0,对于任意一个结点i,其左子结点为2*i+1, 右子结点为2*i+2。
- 堆中最后一个非叶子结点的下标为size/2-1。
//例程中是建一个大头堆template<typename T>void adjustHeap(T data[], int start, int end){//沿着子结点下顺//start的左子结点为2*start+1,右子结点为2*start+2.for (int i = 2 * start + 1; i < end; ++i){if (i < end - 1 && data[i] < data[i + 1])//这里需要注意一下i+1会不会越界{++i;//让i指向子结点中的较大者}if (data[i] < data[start]) //满足堆性质,不用调整{break;}//最大子结点与父结点交换T temp = data[start];data[start] = data[i];data[i] = temp;start = i;//start下顺,接着调整}}//将一个数组初始化为堆,从最后一个非叶子开始从下往上进行adjustHeaptemplate<typename T>void buildHeap(T data[], int size){for (int start = size / 2 - 1; start >= 0; --start){adjustHeap(data, start, size);}}template<typename T>void heapSort(T data[], int size){//对数组建堆buildHeap(data, size);//将堆的第一个元素与最后一个元素交换,然后adjustHeapfor (int i = size - 1; i > 0; --i){T temp = data[0];data[0] = data[i];data[i] = temp;adjustHeap(data, 0, i);}}
下面补充一个递归版的adjust_heap:
template<class T>void adjust_heap(T heap[], int start, int end) //[start, end){ int left = 2 * start + 1, right = 2 * start + 2; if (left < end) { int max_idx = left; if (right < end) { if (heap[left] < heap[right]) { max_idx = right; } } if (heap[max_idx] <= heap[start]) { return; //不用调整了,父节点最大 } std::swap(heap[start], heap[max_idx]); adjust_heap(heap, max_idx, end); }}
1 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- Android开发板之串口开发
- 正则表达式
- request.getParameter(“参数名”) 中文乱码解决方法
- Java核心知识点-JVM结构和工作方式
- svn dump 失败后的处理
- 堆排序
- iOS开发中UIWindow
- 设计模式笔记-Proxy模式
- OKHttp源码解析
- laravel redirect url
- linux c之alarm函数的使用,定时器的实现
- ionic 禁用侧滑后退事件
- C#学习笔记之进程
- linux cd命令