堆排序

来源:互联网 发布:淘宝鞋子女款冬季学生 编辑:程序博客网 时间:2024/04/29 16:04

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) + 1void 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;}

5.运行结果:

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 



0 0