//輸入:待排序數據序列
//功能要求:輸出每步驟排序情況;希望能進行排序方向的選擇(從大到小或從小到大)
#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");
}
驗證: