static void max_heapify(int * arr, unsigned int beginPos, unsigned int length) { unsigned int largest = 0; unsigned int left = 0; unsigned int right = 0; unsigned int tempPos = 0; int tempNum = 0; for(tempPos = beginPos, largest = tempPos; tempPos * 2 + 1 < length; tempPos = largest) { left = tempPos * 2 + 1; right = (tempPos + 1) * 2; /* 循环条件保证,l-child必定在范围内 */ if(arr[tempPos] < arr[left]) { largest = left; } if(right < length) { if(arr[largest] < arr[right]) { largest = right; } } if(largest == tempPos) { break; } else { tempNum = arr[tempPos]; arr[tempPos] = arr[largest]; arr[largest] = tempNum; } } return; } static void build_max_heap(int * arr, unsigned int length) { unsigned heapifyPos = 0; for(heapifyPos = (length - 2)/2;heapifyPos >= 0; --heapifyPos) { max_heapify(arr, heapifyPos, length); if(heapifyPos == 0) { break; } } return; } int heap_sort(int * arr, unsigned int length) { unsigned int heapLast = 0; int tempNum = 0; if(arr == NULL) { return -1; } if(length < 2) { return 0; } build_max_heap(arr, length); for(heapLast = length - 1; heapLast > 0; --heapLast) { tempNum = arr[0]; arr[0] = arr[heapLast]; arr[heapLast] = tempNum; max_heapify(arr,0, heapLast); } return 0; }