/*==============================================================*
* Copyright (C) 2022 All rights reserved.
*
* 文件名称:
* 创 建 者:徐永琪
* 创建日期:2022年04月03日
* 描 述:堆排序
*
================================================================*/
#include <stdio.h>
#include <stdlib.h>
/*by xuyongqi*/
void swap(int *nums, int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
void heapify(int *nums, int index, int heap_size)
{
int left = 2 * index + 1;
while (left < heap_size)
{
// 两个孩子中,谁的值大,把下标给largest
// 1)只有左孩子,left -> largest
// 2) 同时有左孩子和右孩子,右孩子的值<= 左孩子的值,left -> largest
// 3) 同时有左孩子和右孩子并且右孩子的值> 左孩子的值, right -> largest
int largest = left + 1 < heap_size && nums[left + 1] > nums[left] ? left + 1 : left;
largest = nums[largest] > nums[index] ? largest : index;
if(largest == index) break;
swap(nums, largest, index);
index = largest;
left = 2 * index + 1;
}
}
void heap_sort(int *nums, int length)
{
//调整成大根堆结构
for(int i = length -1; i >= 0; i--)
{
heapify(nums, i, length);
}
// 取堆顶最大元素,从后往前放
// 每次取完需要重新调整堆
for (int i = length -1; i >0; i--)
{
swap(nums, 0, i);
heapify(nums, 0, i);
}
}
int main()
{
int arr[] = {8,9,1,7,2,3,5,4,6,0};
int length = sizeof(arr)/sizeof(int);
heap_sort(arr, length);
for (int i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//0 1 2 3 4 5 6 7 8 9
c 实现堆排序
于 2022-04-03 19:32:15 首次发布