八大排序-堆排序

重点主要在于调整函数,其中的for循环:for(tmp = a[pos]; 2*pos + 1 < len;  pos = child)   它不是一次循环,而是每次进入这个循环之后,只要有交换过的非叶子节点都会再一次循环。

#include <stdio.h>

void AdjustMinHeap(int *a, int pos, int len)
{
	int temp;
	int child;

	for (temp = a[pos]; 2 * pos + 1 <= len; pos = child)//并不是一次循环,每次过来之后都会先把当前节点结算清楚,
	                                                    //在移动到交换过值的孩子处往下判断,没有交换过的孩子不需要因为都已经排过序了
	{
		child = 2 * pos + 1;     
		if (child < len && a[child] > a[child + 1])// 这句语句含义很深。
		{
			child++;
		}
		if (a[child] < temp)
		{
			a[pos] = a[child];
		}
		else
		{
			break;
		}
	}
	a[pos] = temp;
}


void HeapSort(int *array, int len)
{
	int i;

	for (i = len / 2 - 1; i >= 0; i--)  
	{
		AdjustMinHeap(array, i, len - 1);
	}
	for (i = len -1; i >= 0; i--)
	{
		Swap(&array[0], &array[i]);
		AdjustMinHeap(array, 0, i - 1);
	}
}
void Swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void PrintArray(int *a, int length)
{
	int i;

	for (i = 0; i < length; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}

int main()
{
	int array[] = {0, 13, 1, 14, 27, 18};
	int length = sizeof(array) / sizeof(array[0]);

	HeapSort(array, length);
	PrintArray(array, length);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/LX370ZZZ/article/details/81610394