1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| void Swap(HPDataType* pa, HPDataType* pb) { HPDataType tmp = *pa; *pa = *pb; *pb = tmp; } void AdjustUp(HPDataType* a, size_t child) { size_t parent = (child - 1) / 2; while (child > 0) { if (a[child]>a[parent]) { Swap(&a[parent], &a[child]); child = parent; parent = (child - 1) / 2; } else { break; } } }
void AdjustDown(HPDataType* a, size_t size, size_t root) { size_t parent = root; size_t child = parent * 2 + 1; while (child<size) { if (child + 1 < size && a[child + 1] > a[child]) { child++; }
if (a[child] > a[parent]) { Swap(&a[parent], &a[child]); parent = child; child = parent*2+1; } else { break; } } }
void HeapSort(int* a, int n) { int i = 1; for (i = 1; i < n; i++) { AdjustUp(a, i); } int end = n - 1; while (end>0) { Swap(&a[0],&a[end]); AdjustDown(a, end, 0); end--; } } int main(void) { int a[10] = { 5,2,4,6,3,7,8,9,1,0 }; HeapSort(a, sizeof(a)/sizeof(a[0])); int i = 0; for (i = 0; i < 10; i++) { printf("%d ",a[i]); } return 0; }
|