码迷,mamicode.com
首页 > 编程语言 > 详细

算法:8 大排序~

时间:2016-06-27 12:29:12      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:算法

#include <stdio.h>  //堆排序(大顶堆)
#include <stdlib.h>

#define MaxSize 50
#define MinSize 2

typedef struct   // 堆的结构 
{
    int *nData;   //存储堆元素
    int nSize;       //堆长度 
}MyHeap;


//从堆的最后一个结点插入,依次向上(父节点)比较,调整合适位置退出
int InCreaseKey(MyHeap *pHeap,int nPos)    //调整堆元素
{
    int nParent,nTemp;
    
    while ( nPos > 1 )   //从最后结点向上比较,最多到根节点
    {
        nParent = nPos/2;
        nTemp = pHeap->nData[nPos];
        
        if ( nTemp > pHeap->nData[nParent] )   //与父节点比较,大于就交换,小于退出
        {
            pHeap->nData[nPos] = pHeap->nData[nParent];
            pHeap->nData[nParent] = nTemp;
            nPos = nParent;
        }
        else
        {
            break;
        }
     }
     
     return 1;
}


void Insert(MyHeap *pHeap,int data)  //数据插入到堆中
{
    ++pHeap->nSize;  //长度增加
    pHeap->nData[pHeap->nSize] = data;
    InCreaseKey(pHeap,pHeap->nSize);
}


int Pop(MyHeap *pHeap)   //从堆中取出数据
{
    int nChild,nMax,nTemp,nPos;
    
    nMax = pHeap->nData[1];
    nPos = 1;
    nChild = nPos*2;
    
    while ( nChild <= pHeap->nSize )  //由根节点开始,依次向孩子节点调整位置
    {
        nTemp = pHeap->nData[nChild];
        if (nChild+1 <= pHeap->nSize && pHeap->nData[nChild+1] > nTemp)//右孩子大于左孩子
        {
            nChild++;
            nTemp = pHeap->nData[nChild];
        }
        
        pHeap->nData[nPos] = nTemp;
        nPos = nChild;
        nChild *= 2;
    }
    
    pHeap->nData[nPos] = pHeap->nData[pHeap->nSize];
    pHeap->nSize--;
    
    return nMax;
    
}




int main(void)
{
	int i,n,r,data;
	MyHeap myHeap;

	printf("请输入要排序的数字的个数(%d-%d): \n",MinSize,MaxSize);
	scanf("%d",&n);

	if ( n<MinSize || n>MaxSize )
	{
		do{
			printf("请输入要排序的数字:  (%d-%d)",MinSize,MaxSize);
			scanf("%d",&n);
			flushall();
		}while ( !(n>=MinSize && n<=MaxSize) );
	}
	
	myHeap.nData = (int *)malloc(sizeof(int)*n);
	myHeap.nSize = n;


	printf("输入要排序的数字:\n");
	for ( i=0 ; i<n ;  )
	{
		r = scanf("%d",&data);
		if ( r == 1 )
		{
			i++;
			Insert(&myHeap,data);
		}
		else
		{
			printf("请输入数字:\n");
			flushall();
		}
	}

	for ( i=0 ; i<n ; i++ )
	{
		printf("%d==>",Pop(&myHeap));
	}
	printf("END\n");
	getch();
	return 0;
}


本文出自 “走得远.看的深” 博客,谢绝转载!

算法:8 大排序~

标签:算法

原文地址:http://2462852817.blog.51cto.com/11224080/1793113

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!