标签:
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。二叉堆可以分为两种形式:最大堆和最小堆。若将记录按从大到小排列,建“小”顶堆。若将记录按从小到大排,建“大”顶堆。
说明:在堆排序算法中,我们使用的是最大堆,最小堆通常用于构造优先队列。
算法分析:时间复杂度是O(nlogn)。堆排序属于原址排序:任何时候都只需要常数个额外的元素空间存储临时数据。堆排序是不稳定的排序算法。
1 #include <stdio.h> 2 #define LEFT(i) 2 * i 3 #define RIGHT(i) 2 * i + 1 4 5 void MaxHeapAjust(int A[], int i, int len) //调整节点i满足最大堆性质 6 { 7 int l = LEFT(i); 8 int r = RIGHT(i); 9 int largest, tmp; 10 11 if (l <= len && A[l - 1] > A[i - 1]) 12 { 13 largest = l; 14 } 15 else 16 { 17 largest = i; 18 } 19 if (r <= len && A[r - 1] > A[largest - 1]) 20 { 21 largest = r; 22 } 23 24 if (i != largest) 25 { 26 tmp = A[i - 1]; 27 A[i - 1] = A[largest - 1]; 28 A[largest - 1] = tmp; 29 30 MaxHeapAjust(A, largest, len); 31 } 32 } 33 34 void BuildMaxHeap(int A[], int len) //构造最大堆 35 { 36 for (int i = len / 2; i > 0; i--) 37 { 38 MaxHeapAjust(A, i, len); 39 } 40 } 41 42 void HeapSort(int A[], int len) //堆排序 43 { 44 int tmp; 45 BuildMaxHeap(A, len); 46 for (int i = len; i > 1; i--) 47 { 48 tmp = A[i - 1]; 49 A[i - 1] = A[0]; 50 A[0] = tmp; 51 52 MaxHeapAjust(A, 1, i - 1); 53 } 54 } 55 56 int main(void) 57 { 58 int A[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7}; 59 HeapSort(A, 10); 60 for (int i = 0; i < 10; i++) 61 { 62 printf("%d ", A[i]); 63 } 64 printf("\n"); 65 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/mengwang024/p/4204786.html