堆排序的时间复杂度为O(nlogn) 构建堆的过程的时间复杂度为n,调堆的时间复杂度为logn
#include<stdio.h>
//大堆:根节点大于左右节点
void Swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
//调整最大堆 我的大堆下标是从0开始
void adjust_max_heap(int *array,int root,int heap_size)
{
int largest = root;//假设根节点现在为最大
int lchild= 2 * root+1; //从0开始 左孩子的下标等于根节点下标*2+1
int rchild= 2 * root +2;//从0开始 右孩子的下标等于根节点下标*2+2
if(lchild < heap_size && array[lchild] > array[root])
{
largest = lchild;
}
if(rchild < heap_size && array[rchild] > array[largest])
{
largest = rchild;
}
if(largest != root)
{
Swap(&array[largest],&array[root]);
adjust_max_heap(array,largest,heap_size);
}
}
void heap_sort(int *array,int len)
{
int i;
//得到最大堆
for(i = len/2-1;i >= 0;i--)
{
adjust_max_heap(array,i,len);
}
int heap_size = len;
for(i = len-1;i >= 1;i--)
{
Swap(&array[0],&array[i]);//把大堆顶上的根节点和堆的最后一个交换
heap_size--;
adjust_max_heap(array,0,heap_size);//从大顶堆的最上面的根节点开始调整
}
}
int main(int argc, char const *argv[])
{
int array[]={0,14,10,8,7,9,3,49,2,4};
heap_sort(array,10);
int i;
for(i=0;i<10;i++)
{
printf("%d\t",array[i]);
}
printf("\n");
return 0;
}
运行结果: