题目:使用堆排序对数组进行排序
解答:堆排序(这里使用最大堆)的步骤是:
- 使用maxHeapify函数对数组自底向上建堆
- 将堆首第一个元素移到堆后,然后再使用maxHeapify生成新堆,堆的长度减1
- 循环进行2,只到堆的长度为1
代码:
#include <iostream>
#include <algorithm>
using namespace std;
void printArr(int *arr, int n)
{
for(int i = 1; i <= n; i++)
{
cout << arr[i] << "\t";
}
cout << endl;
}
//最关键的函数,建堆的时候该函数自低向上
void maxHeapify(int *arr, int n, int index)
{
if(arr == NULL || index > n)
return;
int maxIndex = index;
int left = index * 2;
int right = index * 2 + 1;
if(left <= n && arr[left] > arr[maxIndex])
maxIndex = left;
if(right <= n && arr[right] > arr[maxIndex])
maxIndex = right;
if(maxIndex != index)
{
swap(arr[index], arr[maxIndex]);
maxHeapify(arr, n, maxIndex);
}
}
void makeHeap(int *arr, int n)
{
for(int i = n / 2; i >= 1; i--)
{
maxHeapify(arr, n, i);
}
}
void heapSort(int *arr, int n)
{
makeHeap(arr, n);
printArr(arr, 10);
for(int i = 1; i < n; i++)
{
swap(arr[1], arr[n - i + 1]);
maxHeapify(arr, n - i, 1);
printArr(arr, 10);
}
}