堆和堆排序
2017-03-09 16:03
92 查看
用数组来存储堆,下标为i的结点,父节点的编号为(i-1)/2,子结点的编号为2*i+1, 2*i+2。
建立堆:每次插入一个元素并调整堆的过程。
插入一个元素:插入到数组最后,更新树。
删除一个元素:删除发生在nums[0],将最后一个元素调整到nums[0]处,更新树。
长度为len的数组,最后一个叶子节点的父节点的编号为len/2 -1。
堆的插入
只能插入到堆的最后。
堆的删除
只能删除第0个元素。
堆排序
建立堆:每次插入一个元素并调整堆的过程。
插入一个元素:插入到数组最后,更新树。
删除一个元素:删除发生在nums[0],将最后一个元素调整到nums[0]处,更新树。
长度为len的数组,最后一个叶子节点的父节点的编号为len/2 -1。
堆的插入
只能插入到堆的最后。
void minHeapFixup(int a[], int i) {//i is the position to be insert int tmp; for (int j = (i - 1) / 2; (j >= 0 && i != 0)&& a[i] > a[j]; i = j, j = (i - 1) / 2){ tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } void minHeapAddNumber(int a[], int n, int nNum) { a = nNum; minHeapFixup(a, n); }
堆的删除
只能删除第0个元素。
void minHeapFixdown(int a[], int i, int n) { int j = 2 * i + 1; int temp = a[i]; while (j < n) { if (j + 1 < n && a[j + 1] < a[j]) j++; if (a[j] >= temp) break; a[i] = a[j]; i = j; j = 2 * i + 1; } a[i] = temp; } void minHeapDeleteNumber(int a[], int n) { int tmp = a[0]; a[0] = a[n-1]; a[n-1] = tmp; minHeapFixdown(a, 0, n - 1); }
堆排序
private void minHeapSort(int[] nums) { int i; int len = nums.length; for(i = len/2-1; i >= 0; i--){ adjustMinHeap(nums, i, len -1); } for(i = len-1; i >= 0; i--){ int tmp = nums[0]; nums[0] = nums[i]; nums[i] = tmp; adjustMinHeap(nums, 0, i - 1); } } private void adjustMinHeap(int[] nums, int pos, int len){ int temp; int child; for(temp = nums[pos]; 2 * pos + 1 <= len; pos = child){ child = pos * 2 + 1; if(child < len && nums[child] > nums[child + 1]){ child++; } if(nums[child] < temp){ nums[pos] = nums[child]; }else{ break; } } nums[pos] = temp; }
相关文章推荐
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- STL算法,堆排序
- 白话经典算法系列之七 堆与堆排序
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 堆排序java实现
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- 堆排序 Heap Sort
- 堆排序
- 堆排序原理及实现
- java 堆排序
- 选择排序---简单选择排序 堆排序
- 排序算法08:优先队列与堆排序
- 最大堆排序
- 数据结构基础加强之最小堆的实现与堆排序
- 排序--堆排序
- hdu 1280 堆排序
- c++实现最大堆建立(链表结构)和堆排序
- 堆排序详解
- 排序 堆排序