堆排序
代码
C语言代码:
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void heapify(int arr[], int n, int i) {
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}
void heap_sort(int arr[], int n) {
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for (int i = n - 1; i > 0; i--) {
swap(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Given array is \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
heap_sort(arr, n);
printf("\nSorted array is \n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
代码解释
- 初始化:数组
arr是待排序的数组,n是数组的长度。 - 交换函数:
swap函数用于交换两个整数的值。
- 堆化函数:
heapify函数用于将子树调整为最大堆。largest初始为根节点i。left是左子节点,right是右子节点。- 比较根、左子节点和右子节点,找到最大值。
- 如果最大值不是根节点,交换并递归堆化受影响的子树。
- 堆排序函数:
heap_sort首先构建最大堆。- 从最后一个非叶子节点开始,向上堆化每个节点。
- 然后逐个将最大元素(根节点)移到数组末尾,并重新堆化剩余元素。