#include "stdio.h" 最大堆 A[parent(i)] >= A[i] 最小堆 A[parent(i)] <= A[i] //递归 void MAX_HEAPIFY (int *A,int pos,int length) { int l = pos << 1; int r = (pos << 1) + 1; int largest = pos; if (l <= length && A[largest] < A[l]) { largest = l; } if (r <= length && A[largest] < A[r]) { largest = r; } if (pos != largest) { int t = A[pos]; A[pos] = A[largest]; A[largest] = t; MAX_HEAPIFY (A,largest,length); } } //非递归 void MAX_HEAPIFY_2 (int *A,int pos,int length) { int i,j,l,r,t; t = A[pos]; i = j = pos; wh学校·ile (i <= length){ l = i << 1; r = l + 1; if (l <= length && A[l] > A[j]) { j = l; } if (r <= length && A[r] > A[j]){ j = r; } if (i == j) { return; }else { A[i] = A[j]; i = j; A[j] = t; } } } //建最大堆 void BUILD_MAX_HEAP (int *A,int length) { int j = length / 2; while (j) { MAX_HEAPIFY (A,j,length); j--; } } //建最大堆 void BUILD_MAX_HEAP_2 (int *A,int length) { int j = length / 2; while (j) { MAX_HEAPIFY_2 (A,j,length); j--; } } void HEAPSORT (int *A,int length) { int i,t; BUILD_MAX_HEAP (A,length); for (i = length;i >= 2;i--) { t = A[1]; A[1] = A[i]; A[i] = t; MAX_HEAPIFY (A,1,i-1); } } void HEAPSORT_2 (int *A,int length) { int i,t; BUILD_MAX_HEAP_2 (A,length); for (i = length;i >= 2;i--) { t = A[1]; A[1] = A[i]; A[i] = t; MAX_HEAPIFY_2 (A,1,i-1); } } void print (int *A,int start,int length) { int i; for (i = start;i < start + length;i++) { printf ("%d ",A[i]); } printf ("\n"); } int main () { int A[] = {-1,4,1,3,2,16,9,10,14,8,7}; int B[] = {-1,4,1,3,2,16,9,10,14,8,7}; print (A,1,10); HEAPSORT (A,10); print (A,1,10); HEAPSORT_2 (B,10); print (B,1,10); return 0; } /* *4 1 3 2 16 9 10 14 8 7 *1 2 3 4 7 8 9 10 14 16 *1 2 3 4 7 8 9 10 14 16 */ 算法的正确性:可以用循环不变式证明;运行时间为nlogn;
算法导论-堆排序
最新推荐文章于 2019-10-08 12:15:08 发布