堆排序
/************************************************************************/ /* 堆排序法 /* 时间复杂度:O(NlogN) /************************************************************************/ #include <stdio.h> #define LeftChild(i) ((2 * (i)) + 1) void HeapAdjust(int * array, int i, int N) { int child; int temp; int index; //从该节点开始往下遍历,进行父节点与子节点的排序 for(index = i; LeftChild(index) < N; index = child) { //得到根节点的左儿子 child = LeftChild(index); /*比较左儿子和右儿子的大小,选出较大的那个*/ //如果左儿子小于右儿子 if(child < N - 1 && array[child] < array[child + 1]) { child += 1; } //比较父节点与子节点,如果父节点小于子节点则交换 if(array[index] < array[child]) { //交换父节点与子节点 array[index] = array[index] ^ array[child]; array[child] = /*array[child] ^*/ array[index] ^ array[child]; array[index] = array[index] ^ array[child]; //temp = array[index]; //array[index] = array[child]; //array[child] = temp; } } } void HeapSort(int * array, int N) { /* 建立堆 */ int index; //从原有堆中第一个非页节点开始调整 for(index = N / 2; index >= 0; --index) { HeapAdjust(array, index, N); } int MaxElement; for(index = N - 1; index > 0; --index) { /*交换第一个和最后一个元素,保证最后一个元素是当前堆最大的元素 **交换后堆的实际大小减一*/ MaxElement = array[0]; array[0] = array[index]; array[index] = MaxElement; //交换后原来堆的堆序性发生变化,但是只有堆顶的堆序发生变换,因此只需要调整堆顶的堆序 HeapAdjust(array, 0, index); } } int main() { int array[10] = {10, 45, 78, 32, 89, 18, 105, 953, 243, 19}; HeapSort(array, 10); int i = 0; int j = sizeof(array) / sizeof(int); while (i < j) { printf("%d ", array[i++]); } return 0; }