堆排序C語言實現代碼

 堆排序的C語言代碼實現code

#include<stdio.h>

int a[100];
void Exchange(int i,int n)//將最大葉子結點與根結點交換 
{
	int temp;
	temp = a[i];
	a[i] = a[n];
	a[n] = temp;
	
}

void Created(int n)
{
	if(n == 2){//當只剩兩個的時候,直接比較大小 先輸出最大的 而後輸出最小的 
		if(a[0] > a[1]){
			printf("%d %d\n",a[0],a[1]);
		}
		else
			printf("%d %d\n",a[1],a[0]);
		return;
	}
	int i;
	for(i = n/2-1;i >= 0; i--) //比較每個根結點與其葉子結點的大小   而且將大於根結點的葉子結點與根結點交換 
	{//最後一個根結點是第n/2個 可是第一個數下標爲0  因此最後一個根結點下標爲n/2-1 
		if(a[2*i+1] > a[i] && 2*i+1 < n)//與左孩子進行比較 
			Exchange(i,2*i+1);
		if(a[2*i+2] > a[i] && 2*i+2 < n)//與右孩子進行比較 
			Exchange(i,2*i+2);
	}
	int t;
	t = a[0];//將第一個根結點與最後一個葉子結點互換 
	a[0] = a[n-1];
	a[n-1] = t;
	printf("%d ",a[n-1]);//輸出最大的結點 
	Created(n-1);//將是輸出的結點彈出 
}

int main()
{
	int  n;
	printf("請輸入須要排序的元素的個數:");
	scanf("%d",&n);
	printf("請輸入%d個元素:",n);
	for(int j =0; j <n; j++)
	{
		scanf("%d",&a[j]);
	}
	Created(n);
	return 0;
}