一直知道有这种排序,今天才学会
学习博客:传送门
关于堆排序注意一下几点基本就能掌握这种排序的特点
1.就是每一个子树都是一个堆,也就是保证arr[i] >= arr[i * 2] && arr[i] >= arr[i * 2 + 1] 或者 arr[i] <= arr[i * 2] && arr[i] <= arr[i * 2 + 1]
2.正是因为有条件1的存在所以maxheapify这个函数的操作实际就是条件1的应用,因为你改变的以某个结点为根结点的子树,所以你要保证以这个结点为根的子树还是一个堆,就要对这颗子树进行操作
3.maxHeapify(arr, 0, i); 注意这里的i,当你对整个子树做完最大堆以后,那么你arr[0]中对应的元素就是整个序列的最大数,我们可以将arr[0]与arr[i]交换,然后从新对前i - 1个元素进行一次最大堆的操作,这样不断进行下去整个序列就是一个升序的序列了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
const int qq = 5e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
void maxHeapify(int arr[], int start, int end) {
int dad = start;
int son = dad * 2 + 1;
while (son < end) {
if (son + 1 < end && arr[son] < arr[son + 1]) {
son++;
}
if (arr[dad] > arr[son]) {
return ;
} else {
swap(arr[dad], arr[son]);
dad = son;
son = dad * 2 + 1;
}
}
}
void heapSort(int arr[], int len) {
for (int i = len / 2 - 1; i >= 0; --i) {
maxHeapify(arr, i, len);
}
for (int i = len - 1; i > 0; --i) {
swap(arr[0], arr[i]);
maxHeapify(arr, 0, i);
}
}
int main() {
int arr[] = {4, 1, 3, 6, 2, 9, 10, 14, 8, 7};
int len = (int) sizeof(arr) / sizeof (int);
heapSort(arr, len);
for (int i = 0; i < len; ++i) {
cout << arr[i] << endl;
}
return 0;
}