#include <stdio.h> #include <stdlib.h>
 #define LEN 10
 #define OFFSET 1
 #define SWAP(x,y) {int t; t = x; x = y; y = t;}
 
 void heapSort(int*, int len, int(*)(int, int));
 void heapTree(int*, int, int(*)(int, int));
 void selectFromHeap(int*, int, int(*)(int, int));
 
 void bubbleLeaf(int*, int, int(*)(int, int));
 int isBubbleable(int*, int, int, int(*)(int, int));
 
 void bubbleRoot(int*, int, int(*)(int, int));
 int idxFromChilds(int*, int, int, int(*)(int, int));
 int isRightLeafSuitable(int*, int, int, int(*)(int, int));
 
 void print(int*, int len);
 int ascending(int, int);
 int descending(int, int);
 
 int main(void) {
 int num[LEN] = {10, 9, 1, 2, 5, 3, 8, 7, 12, 11};
 
 heapSort(num, LEN, descending);
 print(num, LEN);
 
 heapSort(num, LEN, ascending);
 print(num, LEN);
 
 system("PAUSE");
 
 return 0;
 }
 
 void heapSort(int* num, int len, int(*compar)(int, int)) {
 heapTree(num, len, compar);
 selectFromHeap(num, len, compar);
 }
 
 void heapTree(int* num, int len, int(*compar)(int, int)) {
 int i, end;
 for(i = 1, end = len + 1; i < end; i++) { bubbleLeaf(num, i, compar); }
 }
 
 void selectFromHeap(int* num, int len, int(*comp)(int, int)) {
 int end;
 for(end = len; end > OFFSET; end--) {
 SWAP(num[1 - OFFSET], num[end - OFFSET]);
 bubbleRoot(num, end, comp);
 }
 }
 
 void bubbleLeaf(int* num, int eleIdx, int(*compar)(int, int)) {
 int childIdx, parentIdx;
 for(childIdx = eleIdx, parentIdx = eleIdx / 2;
 isBubbleable(num, childIdx, parentIdx, compar);
 childIdx = parentIdx, parentIdx = childIdx / 2) {
 SWAP(num[parentIdx - OFFSET], num[childIdx - OFFSET]);
 }
 }
 
 int isBubbleable(int* num, int childIdx,
 int parentIdx, int(*compar)(int, int)) {
 return childIdx > OFFSET &&
 compar(num[parentIdx - OFFSET], num[childIdx - OFFSET]) < 0;
 }
 
 void bubbleRoot(int* num, int end, int(*comp)(int, int)) {
 int parentIdx, childIdx;
 for(parentIdx = 0 + OFFSET,
 childIdx = idxFromChilds(num, parentIdx, end, comp);
 childIdx < end &&
 comp(num[childIdx - OFFSET], num[parentIdx - OFFSET]) > 0;
 parentIdx = childIdx,
 childIdx = idxFromChilds(num, parentIdx, end, comp)) {
 SWAP(num[parentIdx - OFFSET], num[childIdx - OFFSET]);
 }
 }
 
 int idxFromChilds(int* num, int parentIdx, int end, int(*comp)(int, int)) {
 int childIdx = parentIdx * 2;
 return isRightLeafSuitable(num, childIdx, end, comp) ?
 childIdx + 1 : childIdx;
 }
 
 int isRightLeafSuitable(int* num, int childIdx,
 int end, int(*comp)(int, int)) {
 return childIdx < end - 1 &&
 comp(num[childIdx + 1 - OFFSET], num[childIdx - OFFSET]) > 0;
 }
 
 void print(int* arr, int len) {
 int i;
 for(i = 0; i < len; i++) { printf("%d ", arr[i]); }
 printf("\n");
 }
 
 int ascending(int a, int b) { return a - b; }
 int descending(int a, int b) { return -ascending(a, b); }
 
 | 
沒有留言:
張貼留言