堆排序(代码1)
#include <stdio.h> #include <stdlib.h> void build_heap(int data[], int); void adjust_heap(int data[], int); void heap_sort(int data[], int); int sub_max_heap(int data[], int, int); int main(int argc, char *argv[]) { int i; int data[12] = {6, 10, 3, 5, 12, 8, 4, 23, 1, 2, 9, 7 }; heap_sort(data, 12); for (i = 0; i < 12; ++i) { printf("%d ", data[i]); } printf("\n"); return 0; } void heap_sort(int data[], int num) { int i = 1; build_heap(data, num); for (i = 1; i < num; ++i) { int temp; temp = data[0]; data[0] = data[num - i]; data[num - i] = temp; adjust_heap(data, num - i); } } void build_heap(int data[], int num) { int i, k, p; for (i = num / 2 - 1; i >= 0; --i) { k = sub_max_heap(data, num, i); while (2 * k + 1 < num) { p = k; k = sub_max_heap(data, num, p); } } } void adjust_heap(int data[], int num) { int temp; int k, p; k = 0; while(2 * k + 1 < num) { p = k; k = sub_max_heap(data, num, p); } } int sub_max_heap(int data[], int num, int i) { int k; if (2 * i + 2 <= num - 1 && data[2 * i + 1] > data[2 * i + 2]) k = 2 * i + 1; else if (2 * i + 2 <= num - 1) k = 2 * i + 2; else k = 2 * i + 1; if (data[k] > data[i]) { int temp; temp = data[k]; data[k] = data[i]; data[i] = temp; } return k; } /* int sub_max_heap(int data[], int num, int i) { int largest; int l, r; l = 2 * i + 1; r = 2 * i + 2; if (l <= num - 1 && data[l] > data[i]) largest = l; else largest = i; if (r <= num - 1 && data[r] > data[largest]) largest = r; if (largest != i) { int temp; temp = data[i]; data[i] = data[largest]; data[largest] = temp; } return largest; } */