堆排序算法

堆排序算法

/*
 首先说一下堆的性质:
 1,它是一个完全二叉树
 2,每个节点的值小于等于左右孩子节点的
 值称为小根堆,反之为大根堆
 3,对于节点i,左孩子为2i,右孩子为2i+1
 (如果有的话)
 堆排序的思想:
 将待排序的序列构造成一个大根堆。此时,整个
 序列的最大值就是堆顶的根节点。将它与堆数组的
 末尾元素交换,此时末尾元素就是最大值,然后
 将剩余的n-1个序列重新构造成一个堆,如此反复
 就能得到一个有序序列。
 */
#include<cstdio>
#define MAX 1000

typedef struct SeqList
{
	int Array[MAX];
	int length;
}SeqList;

void Swap(SeqList *L,int i,int j)
{
	int temp=L->Array[i];
	L->Array[i]=L->Array[j];
	L->Array[j]=temp;
}

void HeapAdjust(SeqList *L,int s,int len)
{
	int temp,j;
	temp=L->Array[s];
	for(j=2*s;j<=len;j=j*2)
	{
		if(j<len&&L->Array[j]<L->Array[j+1])//如果左孩子<右孩子,记录右孩子
			j++;
		if(temp>=L->Array[j])//应该在S处插入
			break;
		L->Array[s]=L->Array[j];
		s=j;
	}
	L->Array[s]=temp;
}

void HeapSort(SeqList *L)
{
	int i;
	for(i=L->length/2;i>0;i--)
		HeapAdjust(L,i,L->length);//把Array构造成一个大根堆
	
	for(i=L->length;i>1;i--)
	{
		Swap(L,1,i);//与末尾元素交换
		HeapAdjust(L,1,i-1);//将剩余元素构造成一个大根堆
	}
}

int main(int argc,char *argv[])
{
	int i,n;
	SeqList L;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&L.Array[i]);
	L.length=n;
	HeapSort(&L);
	printf("After sort:\n");
	for(i=1;i<=L.length;i++)
		printf("%4d",L.Array[i]);
	printf("\n");

	return 0;
}


你可能感兴趣的:(数据结构,算法,C语言,堆排序)