堆排序

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;	
}

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值