堆排序:根据输入数据,利用堆的调整算法形成初始堆,然后交换根元素与尾元素,总的元素个数减1,然后从根往下调整。堆排序的最好、最坏、平均时间复杂度都为O(nlogn)
# include <stdio.h>
void heap_adjust(int a[],int i,int len);
void heap_sort(int a[],int len);
int main (void)
{
int a[]={1,6,46,132,464,3541,654,131,56,41};
heap_sort(a,sizeof(a)/sizeof(a[0]));
for (int i=0; i<sizeof(a)/sizeof(a[0]); ++i)
printf ("%d ",a[i]);
return 0;
}
void heap_adjust(int a[],int i,int len) //整理函数
{
int nchild;
int temp;
for (;2*i+1 < len;i = nchild)
{
nchild = 2*i+1; //子节点在数组中的位置
if (nchild < len-1 && a[nchild] < a[nchild+1]) //找到最大的子节点
++nchild;
if (a[i] < a[nchild]) //父节点要大于子节点
{
temp = a[i]; //进行交换
a[i] = a[nchild];
a[nchild] = temp;
}
else
break;
}
}
void heap_sort(int a[],int len) //堆排序
{
int i;
for (i=len/2-1;i>=0;--i) //将整个数组的数字进行整理
heap_adjust(a,i,len);
for (i=len-1;i>0;--i) //逐步缩小范围
{
int temp = a[0];
a[0] = a[i];
a[i] = temp;
heap_adjust(a,0,i); //对根节点进行调整
}
}