《算法导论》CLRS算法C++实现(三)P75 堆排序
2012-06-04 23:08
288 查看
第六章 堆排序
主要分为三个子算法。算法MAX-HEAPIFY(A, i)为调整堆,算法BUILD-MAX-HEAP(A)为建堆,算法HEAPSORT(A)为堆排序。运行环境Code::Blocks 10.05。
MAX-HEAPIFY(A, i)
BUILD-MAX-HEAP(A)
HEAPSORT(A)
C++代码实现
主要分为三个子算法。算法MAX-HEAPIFY(A, i)为调整堆,算法BUILD-MAX-HEAP(A)为建堆,算法HEAPSORT(A)为堆排序。运行环境Code::Blocks 10.05。
MAX-HEAPIFY(A, i)
l ← LEFT(i) r ← RIGHT(i) if l ≤ heap-size[A] and A[l] > A[i] then largest ← l else largest ← i if r ≤ heap-size[A] and A[r] > A[largest] then largest ← r if largest ≠ i then swap(A[i], A[largest]) MAX-HEAPIFY(A, largest)
BUILD-MAX-HEAP(A)
heap-size[A] ← length[A] for i ← ⌊length[A]/2⌋ down to 1 do MAX-HEAPIFY(A, i)
HEAPSORT(A)
BUILD-MAX-HEAP(A) for i ← length[A] downto 2 do exchange A[1] ↔ A[i] heap-size[A] ← heap-size[A] - 1 MAX-HEAPIFY(A, 1)
C++代码实现
#include <iostream> using namespace std; //交换x和y void swap(int* x, int* y) { int temp; temp = *x; *x = *y; *y = temp; } //返回左孩子的下标 inline int left(int i) { return 2 * i + 1; } //返回右孩子的下标 inline int right(int i) { return 2 * i + 2; } //返回父结点 inline int parent(int i) { if(i % 2) return (i - 1) / 2; return (i - 2) / 2; } void maxHeapify(int* arr, int i, int heapsize) { int l = left(i); int r = right(i); int largest; if((l < heapsize) && (arr[l] > arr[i])) largest = l; else largest = i; if((r < heapsize) && (arr[r] > arr[largest])) largest = r; if(largest != i) { swap(arr[i], arr[largest]); maxHeapify(arr, largest, heapsize); } } void buildMaxHeap(int* arr, int length) { int i; for(i = length / 2; i >= 0; i--) { maxHeapify(arr, i, length); } } void heapSort(int* arr, int length) { int i, heapsize = length; buildMaxHeap(arr, length); for(i = heapsize - 1; i > 0; i--) { swap(arr[0], arr[i]); heapsize--; maxHeapify(arr, 0, heapsize); } } int main() { int arr[] = {0, 2, 6, 98, 34, -5, 23, 11, 89, 100, 7}; heapSort(arr, 11); for(int i = 0; i < 11; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
相关文章推荐
- 《算法导论》CLRS算法C++实现(三)P75 堆排序
- 《算法导论》CLRS算法C++实现(二)P17 归并排序
- 《算法导论》CLRS算法C++实现(六)P100 基数排序
- 算法导论(Introduction to Algorithms)之堆排序(C语言实现)
- 《算法导论》7、堆排序实现(C++)
- 《算法导论》CLRS算法C++实现(七)P102 桶排序
- 《算法导论》CLRS算法C++实现(四)P85 快速排序
- 算法导论Java实现-堆排序(6.4章节)
- 《算法导论》CLRS算法C++实现(八)P108 最大值和最小值
- 算法导论堆排序java实现
- 算法导论,堆排序,c实现。
- 《算法导论》CLRS算法C++实现(十二)P208 最长公共子序列LCS
- 《算法导论》CLRS算法C++实现(九)P109 选择数组中第i小(大)的数 顺序统计量
- 算法导论堆排序python实现
- 《算法导论》CLRS算法C++实现(十)P151 二叉查找树
- 算法导论堆排序Java实现
- 算法导论-----------堆排序研究 (堆排序原理及算法实现(最大堆))
- 《算法导论》CLRS算法C++实现(十)P151 二叉查找树
- 算法导论:堆排序(java实现)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现