时间复杂度: O(nlogn)
堆排序代码
#include "stdafx.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 100
#define MAX 100
void HEAP_UP(int a[],int n)
{
int i,x;
bool done=false;
i=n;
if(i==1)
return;
while(!(i==1||done))
{
if(a[i]>a[i/2])
{
x=a[i];
a[i]=a[i/2];
a[i/2]=x;
}
else
done=true;
i=i/2;
}
}
void HEAP_DOWN(int a[],int key,int n)
{
int i,x;
bool done=false;
i=key;
if(2*i>n)
return;
do
{
i=2*i;
if((i+1<=n)&&(a[i]<a[i+1]))i++;
if(a[i]>a[i/2])
{
x=a[i];
a[i]=a[i/2];
a[i/2]=x;
}
else
done=true;
}while(!(2*i>n||done));
}
void HEAP_INSERT(int a[],int *n,int x)
{
*n=*n+1;
a[*n]=x;
HEAP_UP(a,*n);
}
void HEAP_MAKE(int a[],int n)
{
for(int i=n/2;i>=1;i--)HEAP_DOWN(a,i,n);
}
void HEAP_DELETE(int a[],int i,int *n)
{
int x,y;
x=a[i];
y=a[*n];
*n=*n-1;
if(i==*n+1)return;
a[i]=y;
if(y>=x)HEAP_UP(a,i);
else
HEAP_DOWN(a,i,*n);
}
int HEAPSORT(int a[],int n)
{
HEAP_MAKE(a,n);
for(int i=n;i>0;i--)
{
a[0]=a[1];
a[1]=a[i];
a[i]=a[0];
HEAP_DOWN(a,1,i-1);
}
return 0;
}
void main ()
{
int a[MAX];
srand(time(NULL));
for(int i=1;i<MAX;i++)a[i]=rand()%10000;
printf("old data\n");
for(int j=1;j<MAX;j++)
printf("%d\t",a[j]);
HEAPSORT(a,MAX);
printf("\n
new data\n");
for(int k=1;k<MAX;k++)
printf("%d\t",a[k]);
}
测试结果