堆排序的C實現

//輸入:待排序數據序列
//功能要求:輸出每步驟排序情況;希望能進行排序方向的選擇(從大到小或從小到大)


#include<stdio.h>
#include<stdlib.h>


/************************大頂堆******************************/
void maxHeap(int A[],int len,int i)
{
    int l,r,large,temp;
    l=2*i;
    r=2*i+1;
    large=i;
    if(l<len)
    {
        if(A[l]>A[i])
        {
            large=l;
        }
    }
    if(r<len)
    {
        if(A[r]>A[large])
        {
            large=r;
        }    
    }

    if(large!=i)
    {
        temp=A[large];
        A[large]=A[i];
        A[i]=temp;
        maxHeap(A,len,large);
    }
}

/*建立頂堆*/
void buildMaxHeap(int A[],int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)
        maxHeap(A,len,i);
}


/*堆排序*/
void maxHeapSort(int A[],int len)
{
    int i,temp,j,k=0;
    int sort[len];
    buildMaxHeap(A,len);
    printf("建立大頂堆: ");
    for(i=0;i<len;i++)
        printf("%d ",A[i]);
    printf("\n");
    for(i=len;i>1,k<len;i--,k++)
    {
        temp=A[0];
        A[0]=A[i-1];
        A[i-1]=temp;
       	sort[k]=A[i-1];
        //printf("%d  ",A[i-1]);
        buildMaxHeap(A,i-1);
        if(k != len -1){
            printf("新堆: ");
      		for(j=0;j<i-1;j++)
        	printf("%d ",A[j]);
			}
       	putchar(10);
    }
    printf("排序之後:");
    for(k=0;k<len;k++)
    	printf("%d ",sort[k]);
    printf("\n");
}
/*******************小頂堆*****************/
void minHeap(int A[],int len,int i)
{
    int l,r,small,temp;
    l=2*i;
    r=2*i+1;
    small=i;
    if(l<len)
    {
        if(A[l]<A[i])
        {
            small=l;
        }
    }
    if(r<len)
    {
        if(A[r]<A[small])
        {
            small=r;
        }    
    }

    if(small!=i)
    {
        temp=A[small];
        A[small]=A[i];
        A[i]=temp;
        minHeap(A,len,small);
    }
}

void buildMinHeap(int A[],int len)
{
    int i;
    for(i=len/2-1;i>=0;i--)
        minHeap(A,len,i);
}

void minHeapSort(int A[],int len)
{
    int i,temp,j,k=0;
    int sort[len];
    buildMinHeap(A,len);
    printf("建立小頂堆: ");
    for(i=0;i<len;i++)
        printf("%d ",A[i]);
    printf("\n");
    for(i=len;i>1,k<len;i--,k++)
    {
        temp=A[0];
        A[0]=A[i-1];
        A[i-1]=temp;
       	sort[k]=A[i-1];
        //printf("%d  ",A[i-1]);
        buildMinHeap(A,i-1);
        if(k != len -1){
            printf("新堆: ");
      		for(j=0;j<i-1;j++)
        	printf("%d ",A[j]);
			}
       	putchar(10);
    }
    printf("排序之後:");
    for(k=0;k<len;k++)
    	printf("%d ",sort[k]);
    printf("\n");
}

/*測試堆排序*/
int main()
{
    int i=0,temp,len,choose=0;
    int A[20];
	printf("請輸入排序的數(-1結束):");
	scanf("%d",&temp);
	A[0]=temp;
	while(temp!=-1){
	
		scanf("%d",&temp);
		i++;
		A[i]=temp;
	}
	len=i;
    maxHeapSort(A,len);
	minHeapSort(A,len);
    printf("\n");
}


 

驗證:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章