堆排序算法实现的思路与C++代码实现
什么是堆排序
堆排序是一种基于二叉堆结构的排序算法,其主要思想是将待排序数组构建成一个二叉堆,并反复将最大或最小值交换至堆的末端,最终完成排序。
堆排序是一种原地排序算法,在最好、最坏和平均情况下的时间复杂度均为O(nlogn)。
堆排序算法思路
堆排序的核心是构建二叉堆和不断交换堆顶元素和末尾元素,具体步骤如下:
- 将待排序数组构建成二叉堆,即建立一个元素个数与待排序数组相同的完全二叉树,满足父节点的值大于或小于其子节点的值,称为大根堆或小根堆;
- 从堆底开始,依次将堆顶元素与堆末尾元素交换,将堆大小减一,并重新对堆进行调整,使其满足堆的性质,其中调整过程即为向下特定子树的过程,称为堆化(heapify);
- 重复第二步,直至堆大小为1,排序完成。
C++代码实现
以下为C++实现的堆排序代码,其中,构建大根堆的函数buildHeap和向下调整的函数heapify是堆排序算法的关键。
```
#include
using namespace std;
void heapify(int* arr, int i, int heapSize) {
int left = i * 2 + 1, right = i * 2 + 2, largest = i;
if (left < heapSize && arr[left] > arr[largest]) {
largest = left;
}
if (right < heapSize && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(arr[i], arr[largest]);
heapify(arr, largest, heapSize);
}
}
void buildHeap(int* arr, int n) {
int heapSize = n;
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, i, heapSize);
}
}
void heapSort(int* arr, int n) {
buildHeap(arr, n);
for (int i = n - 1; i > 0; i--) {
swap(arr[0], arr[i]);
heapify(arr, 0, i);
}
}
int main() {
int arr[] = {7, 3, 5, 8, 1, 9};
int n = sizeof(arr) / sizeof(int);
heapSort(arr, n);
for (int i = 0; i < n; i++) {
cout << arr[i] << \" \";
}
return 0;
}
```
总结
堆排序是一种高效的排序算法,其核心在于构建二叉堆和不断交换堆顶元素和末尾元素,并进行堆化调整,以满足堆的性质。C++语言实现堆排序较为简单,建议初学者多加练习,并结合常规排序算法进行比较,加深对堆排序的理解。