堆排序---最大堆的创建和最大推的排序

typedef struct{
	int data[100+1];
    int length;
}Slist;
void swap(Slist *L,int i,int j){
	int tmp=L->data[i];
	L->data[i]=L->data[j];
	L->data[j]=tmp;
}

void HeapAdjust(Slist *L,int s,int m){
	//理解该代码要完全二叉树联系起来,不清楚画图分析
	//并理解堆排序的定义-----最大堆:每个节点值都大于或等于左右孩子节点值。
	int temp=L->data[s];
	for(int j=2*s;j<=m;j*=2){
	  
		if(j<m && L->data[j]<L->data[j+1])//找出左右子树中值大的。并记住下标
			j++;
		if(temp>L->data[j]) //对当前要调整节点值和左右子树中较大的值比较。若比左右子树值都大则不交换数据。
			break;
		L->data[s]=L->data[j];
		s=j;	
	}
	L->data[s]=temp;
}
//创建最大堆--创建顺序:从下往上,从右往左。
void craateHeap(Slist *L){
	for(int i=L->length/2;i>0;i--)//完全二叉树非叶子节点个数=叶子节点个数或者叶子节点个数-1;
	HeapAdjust(L,i,L->length);
}
//已知最大堆,进行排序
void Maxheapsort(Slist *L){ 
	   for(int i=L->length;i>1;i--){// n-1次循环
		   swap(L,1,i);
	   HeapAdjust(L,1,i-1);
	   }
	 }
void main(){
	int a[]={0,110,10,35,30,71,42,80,23,43,54,67};

	int len=sizeof(a)/sizeof(int)-1;
	//1、初始化未排序的线性表

	Slist SS,*L;
	 L=&SS;
	 L->length=len;
	 int i=len;
	 while (i)
	 {
		 L->data[i]=a[i];
		 i--;
	 }
	printf("数据未排序前:\n ");
	for(int k=1;k<=L->length;k++)
	   printf("%d  ",L->data[k]);
	 //2、对已知未排序的线性表进行最大堆的创建
	 craateHeap(L);
	 //3、对最大堆进行排序(完全二叉树层次排序)
	  Maxheapsort(L);
	//4、打印查看
    printf("\n  数据排序后:\n ");
        for(int k=1;k<=L->length;k++)
		     printf("%d  ",L->data[k]);
	while (true)
	{

	}

}



阅读更多
个人分类: C/C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭