📅  最后修改于: 2023-12-03 14:51:37.748000             🧑  作者: Mango
堆排序是一种基于堆数据结构的排序算法。在堆排序中,我们将序列按照大小建立成一个大根堆或小根堆,然后再以此为基础进行排序。
堆排序的时间复杂度为 $O(nlogn)$,同时它也是一种原地排序算法。
以下是使用C++语言实现堆排序的程序代码:
#include <iostream>
using namespace std;
void heapify(int arr[], int n, int i)
{
int largest = i;
int l = 2*i + 1;
int r = 2*i + 2;
if (l < n && arr[l] > arr[largest])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i)
{
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
void heapSort(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);
}
}
void printArray(int arr[], int n)
{
for (int i=0; i<n; ++i)
cout << arr[i] << " ";
cout << "\n";
}
int main()
{
int arr[] = {12, 11, 13, 5, 6, 7};
int n = sizeof(arr)/sizeof(arr[0]);
heapSort(arr, n);
cout << "Sorted array is \n";
printArray(arr, n);
}
该程序使用了heapify函数来维护一个堆。在初始时,我们首先将数组构建成一个堆,然后进行堆排序,最后输出排好序的数组。
heapSort函数中,我们首先对初始的数组进行堆化,然后不断地将堆顶元素和堆底元素交换,再重新堆化,直到数组排好序。
printArray函数为输出数组的函数,其中的for循环遍历数组并输出。
通过本文的介绍,我们可以知道堆排序是一种基于堆数据结构的排序算法,它的时间复杂度为 $O(nlogn)$,同时也是一种原地排序算法。
如果想对堆排序有更深入的了解,建议去学习堆数据结构及其实现。