标签:
1.堆: 类似二叉树
数据组织方式->数组对象
2.种类: 最大堆->A[PARENT(i)] >= A[i]
最小堆->A[PARENT(i)] <= A[i]
3.建堆:Heap_max_Build
保持堆性质:Heap_max_Ify
堆排序:Heap_max_Sort
4.Code
#include <stdio.h> #include <assert.h> #define PARAEN(i) (i) / 2 #define LEFT(i) 2 * (i) #define RIGHT(i) 2 * (i) + 1 void Heap_max_Display(int *piArray, int iSize) { int iCnt = 0; assert(piArray != NULL); printf("Heap sequence: "); for (iCnt = 1; iCnt <= iSize; iCnt++) { printf("%d ", piArray[iCnt]); } printf("\r\n"); return; } void Heap_max_Ify(int *piArray, int iSize, int iPosition) { int iLeft = 0; int iRight = 0; int iLargest = 0; int iSwapValue = 0; assert(piArray != NULL); assert(iPosition >= 1); iLeft = LEFT(iPosition); iRight = RIGHT(iPosition); iLargest = iPosition; printf("Heap max ify:%d %d %d %d start\r\n", iPosition, iLeft, iRight, iSize); Heap_max_Display(piArray, iSize); /* 小于堆的大小 */ if ((iLeft <= iSize) && (piArray[iLeft] > piArray[iPosition])) { iLargest = iLeft; } if ((iRight <= iSize) && (piArray[iRight] > piArray[iLargest])) { iLargest = iRight; } if (iLargest != iPosition) { iSwapValue = piArray[iLargest]; piArray[iLargest] = piArray[iPosition]; piArray[iPosition] = iSwapValue; printf("Swap position %d %d \r\n", iPosition, iLargest); printf("Swap value %d %d \r\n", piArray[iPosition], piArray[iLargest]); Heap_max_Ify(piArray, iSize, iLargest); } else { printf("No need swap\r\n"); } printf("Heap max ify:%d %d %d %d finish\r\n", iPosition, iLeft, iRight, iSize); Heap_max_Display(piArray, iSize); return; } void Heap_max_Build(int *piArray, int iSize) { int iCnt = 0; assert(piArray != NULL); printf("Heap max build size:%d start \r\n", iSize); for (iCnt = iSize / 2 ; iCnt >= 1; iCnt--) { Heap_max_Ify(piArray, iSize, iCnt); } printf("Heap max build size:%d finish \r\n", iSize); return; } /* 构造一个最大堆,然后交换第一个和最后一个; 堆的大小减一; 重新构造堆; 依此类推 */ void Heap_max_Sort1(int *piArray, int iSize) { int iCnt = 0; int iHeapSize = 0; int iHeapValue = 0; assert(piArray != NULL); iHeapSize = iSize; for (iCnt = iHeapSize; iCnt >= 1; iCnt--) { Heap_max_Build(piArray, iHeapSize); iHeapValue = piArray[iHeapSize]; piArray[iHeapSize] = piArray[1]; piArray[1] = iHeapValue; iHeapSize--; } return; } /* 构造最大堆; 交换最大值和最后一个值; 堆的大小减一; 继续保持堆的性质; 依此类推 复杂度:nlgn*/ void Heap_max_Sort(int *piArray, int iSize) { int iHeapSize = 0; int iHeapValue = 0; assert(piArray != NULL); Heap_max_Build(piArray, iSize); iHeapSize = iSize; /* 一直比较,直到剩下两个 */ while (iHeapSize >= 2) { iHeapValue = piArray[iHeapSize]; piArray[iHeapSize] = piArray[1]; piArray[1] = iHeapValue; iHeapSize--; Heap_max_Ify(piArray, iHeapSize, 1); } return; } int main() { int aiArray[12 + 1] = {0, 0, 2, 3, 4, 0, 8, 9, 6, 7, 0, 11, 12}; Heap_max_Display(aiArray, 12); Heap_max_Sort(aiArray, 12); Heap_max_Display(aiArray, 12); return 0; }
Heap sequence: 0 2 3 4 0 8 9 6 7 0 11 12
Heap max build size:12 start
Heap max ify:6 12 13 12 start
Heap sequence: 0 2 3 4 0 8 9 6 7 0 11 12
Swap position 6 12
Swap value 12 8
Heap max ify:12 24 25 12 start
Heap sequence: 0 2 3 4 0 12 9 6 7 0 11 8
No need swap
Heap max ify:12 24 25 12 finish
Heap sequence: 0 2 3 4 0 12 9 6 7 0 11 8
Heap max ify:6 12 13 12 finish
Heap sequence: 0 2 3 4 0 12 9 6 7 0 11 8
Heap max ify:5 10 11 12 start
Heap sequence: 0 2 3 4 0 12 9 6 7 0 11 8
Swap position 5 11
Swap value 11 0
Heap max ify:11 22 23 12 start
Heap sequence: 0 2 3 4 11 12 9 6 7 0 0 8
No need swap
Heap max ify:11 22 23 12 finish
Heap sequence: 0 2 3 4 11 12 9 6 7 0 0 8
Heap max ify:5 10 11 12 finish
Heap sequence: 0 2 3 4 11 12 9 6 7 0 0 8
Heap max ify:4 8 9 12 start
Heap sequence: 0 2 3 4 11 12 9 6 7 0 0 8
Swap position 4 9
Swap value 7 4
Heap max ify:9 18 19 12 start
Heap sequence: 0 2 3 7 11 12 9 6 4 0 0 8
No need swap
Heap max ify:9 18 19 12 finish
Heap sequence: 0 2 3 7 11 12 9 6 4 0 0 8
Heap max ify:4 8 9 12 finish
Heap sequence: 0 2 3 7 11 12 9 6 4 0 0 8
Heap max ify:3 6 7 12 start
Heap sequence: 0 2 3 7 11 12 9 6 4 0 0 8
Swap position 3 6
Swap value 12 3
Heap max ify:6 12 13 12 start
Heap sequence: 0 2 12 7 11 3 9 6 4 0 0 8
Swap position 6 12
Swap value 8 3
Heap max ify:12 24 25 12 start
Heap sequence: 0 2 12 7 11 8 9 6 4 0 0 3
No need swap
Heap max ify:12 24 25 12 finish
Heap sequence: 0 2 12 7 11 8 9 6 4 0 0 3
Heap max ify:6 12 13 12 finish
Heap sequence: 0 2 12 7 11 8 9 6 4 0 0 3
Heap max ify:3 6 7 12 finish
Heap sequence: 0 2 12 7 11 8 9 6 4 0 0 3
Heap max ify:2 4 5 12 start
Heap sequence: 0 2 12 7 11 8 9 6 4 0 0 3
Swap position 2 5
Swap value 11 2
Heap max ify:5 10 11 12 start
Heap sequence: 0 11 12 7 2 8 9 6 4 0 0 3
No need swap
Heap max ify:5 10 11 12 finish
Heap sequence: 0 11 12 7 2 8 9 6 4 0 0 3
Heap max ify:2 4 5 12 finish
Heap sequence: 0 11 12 7 2 8 9 6 4 0 0 3
Heap max ify:1 2 3 12 start
Heap sequence: 0 11 12 7 2 8 9 6 4 0 0 3
Swap position 1 3
Swap value 12 0
Heap max ify:3 6 7 12 start
Heap sequence: 12 11 0 7 2 8 9 6 4 0 0 3
Swap position 3 7
Swap value 9 0
Heap max ify:7 14 15 12 start
Heap sequence: 12 11 9 7 2 8 0 6 4 0 0 3
No need swap
Heap max ify:7 14 15 12 finish
Heap sequence: 12 11 9 7 2 8 0 6 4 0 0 3
Heap max ify:3 6 7 12 finish
Heap sequence: 12 11 9 7 2 8 0 6 4 0 0 3
Heap max ify:1 2 3 12 finish
Heap sequence: 12 11 9 7 2 8 0 6 4 0 0 3
Heap max build size:12 finish
Heap max ify:1 2 3 11 start
Heap sequence: 3 11 9 7 2 8 0 6 4 0 0
Swap position 1 2
Swap value 11 3
Heap max ify:2 4 5 11 start
Heap sequence: 11 3 9 7 2 8 0 6 4 0 0
Swap position 2 4
Swap value 7 3
Heap max ify:4 8 9 11 start
Heap sequence: 11 7 9 3 2 8 0 6 4 0 0
Swap position 4 8
Swap value 6 3
Heap max ify:8 16 17 11 start
Heap sequence: 11 7 9 6 2 8 0 3 4 0 0
No need swap
Heap max ify:8 16 17 11 finish
Heap sequence: 11 7 9 6 2 8 0 3 4 0 0
Heap max ify:4 8 9 11 finish
Heap sequence: 11 7 9 6 2 8 0 3 4 0 0
Heap max ify:2 4 5 11 finish
Heap sequence: 11 7 9 6 2 8 0 3 4 0 0
Heap max ify:1 2 3 11 finish
Heap sequence: 11 7 9 6 2 8 0 3 4 0 0
Heap max ify:1 2 3 10 start
Heap sequence: 0 7 9 6 2 8 0 3 4 0
Swap position 1 3
Swap value 9 0
Heap max ify:3 6 7 10 start
Heap sequence: 9 7 0 6 2 8 0 3 4 0
Swap position 3 6
Swap value 8 0
Heap max ify:6 12 13 10 start
Heap sequence: 9 7 8 6 2 0 0 3 4 0
No need swap
Heap max ify:6 12 13 10 finish
Heap sequence: 9 7 8 6 2 0 0 3 4 0
Heap max ify:3 6 7 10 finish
Heap sequence: 9 7 8 6 2 0 0 3 4 0
Heap max ify:1 2 3 10 finish
Heap sequence: 9 7 8 6 2 0 0 3 4 0
Heap max ify:1 2 3 9 start
Heap sequence: 0 7 8 6 2 0 0 3 4
Swap position 1 3
Swap value 8 0
Heap max ify:3 6 7 9 start
Heap sequence: 8 7 0 6 2 0 0 3 4
No need swap
Heap max ify:3 6 7 9 finish
Heap sequence: 8 7 0 6 2 0 0 3 4
Heap max ify:1 2 3 9 finish
Heap sequence: 8 7 0 6 2 0 0 3 4
Heap max ify:1 2 3 8 start
Heap sequence: 4 7 0 6 2 0 0 3
Swap position 1 2
Swap value 7 4
Heap max ify:2 4 5 8 start
Heap sequence: 7 4 0 6 2 0 0 3
Swap position 2 4
Swap value 6 4
Heap max ify:4 8 9 8 start
Heap sequence: 7 6 0 4 2 0 0 3
No need swap
Heap max ify:4 8 9 8 finish
Heap sequence: 7 6 0 4 2 0 0 3
Heap max ify:2 4 5 8 finish
Heap sequence: 7 6 0 4 2 0 0 3
Heap max ify:1 2 3 8 finish
Heap sequence: 7 6 0 4 2 0 0 3
Heap max ify:1 2 3 7 start
Heap sequence: 3 6 0 4 2 0 0
Swap position 1 2
Swap value 6 3
Heap max ify:2 4 5 7 start
Heap sequence: 6 3 0 4 2 0 0
Swap position 2 4
Swap value 4 3
Heap max ify:4 8 9 7 start
Heap sequence: 6 4 0 3 2 0 0
No need swap
Heap max ify:4 8 9 7 finish
Heap sequence: 6 4 0 3 2 0 0
Heap max ify:2 4 5 7 finish
Heap sequence: 6 4 0 3 2 0 0
Heap max ify:1 2 3 7 finish
Heap sequence: 6 4 0 3 2 0 0
Heap max ify:1 2 3 6 start
Heap sequence: 0 4 0 3 2 0
Swap position 1 2
Swap value 4 0
Heap max ify:2 4 5 6 start
Heap sequence: 4 0 0 3 2 0
Swap position 2 4
Swap value 3 0
Heap max ify:4 8 9 6 start
Heap sequence: 4 3 0 0 2 0
No need swap
Heap max ify:4 8 9 6 finish
Heap sequence: 4 3 0 0 2 0
Heap max ify:2 4 5 6 finish
Heap sequence: 4 3 0 0 2 0
Heap max ify:1 2 3 6 finish
Heap sequence: 4 3 0 0 2 0
Heap max ify:1 2 3 5 start
Heap sequence: 0 3 0 0 2
Swap position 1 2
Swap value 3 0
Heap max ify:2 4 5 5 start
Heap sequence: 3 0 0 0 2
Swap position 2 5
Swap value 2 0
Heap max ify:5 10 11 5 start
Heap sequence: 3 2 0 0 0
No need swap
Heap max ify:5 10 11 5 finish
Heap sequence: 3 2 0 0 0
Heap max ify:2 4 5 5 finish
Heap sequence: 3 2 0 0 0
Heap max ify:1 2 3 5 finish
Heap sequence: 3 2 0 0 0
Heap max ify:1 2 3 4 start
Heap sequence: 0 2 0 0
Swap position 1 2
Swap value 2 0
Heap max ify:2 4 5 4 start
Heap sequence: 2 0 0 0
No need swap
Heap max ify:2 4 5 4 finish
Heap sequence: 2 0 0 0
Heap max ify:1 2 3 4 finish
Heap sequence: 2 0 0 0
Heap max ify:1 2 3 3 start
Heap sequence: 0 0 0
No need swap
Heap max ify:1 2 3 3 finish
Heap sequence: 0 0 0
Heap max ify:1 2 3 2 start
Heap sequence: 0 0
No need swap
Heap max ify:1 2 3 2 finish
Heap sequence: 0 0
Heap max ify:1 2 3 1 start
Heap sequence: 0
No need swap
Heap max ify:1 2 3 1 finish
Heap sequence: 0
Heap sequence: 0 0 0 2 3 4 6 7 8 9 11 12
标签:
原文地址:http://blog.csdn.net/point123456789/article/details/42936081