最近面试被闻到了堆排序,一时没有想起来,记录一下。
1、最大堆和最小堆
最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素都不大于其左右孩子。也就是n[i] 和n[2*i+1]、n[2*i-1]的关系分别为大于和小于。
2、堆排序的过程
堆排序就是构建最大/最小堆然后把首元素和最后一个(没有排序的)元素交换的过程。
最大堆/最小堆的构建:遍历从size/2到最开始的元素,如果发现这里面存在其孩子节点大于自身的话,进行对调。
代码实现如下:
void build_heap(int *arr, int count)
{
//构建大堆
for(int i=count/2; i>=0; i--)
{
//left child
if(arr[i] < arr[2*i-1] && (2*i-1)>=count)
{
swap(arr+i, arr+(2*i-1));
}
if(arr[i] < arr[2*i+1] && (2*i+1)>=count)
{
swap(arr+i, arr+(2*i+1));
}
}
}
void heap_sort(int *arr, int count)
{
int max = count;
for(; max>0; max--)
{
build_heap(arr, max+1);
swap(arr, arr+max);
}
}
void swap(int*a, int*b)
{
int* tmp = a;
a = b;
b = tmp;
}