堆排序(升)
堆排序是一种基于二叉堆数据结构的排序算法。它的主要想是将待排序的序列构建成一个大顶堆(或小顶),然后依次将堆顶元素与最后一个元素交换,并重新调整堆,使得剩余元素仍满足堆的性质。通过不断重复这个过程,最终得到一个有序的序列。
步骤一
构造大顶堆,即每个父节点都比子节点大,最后顶点就是最大。方法:从下到上
步骤二
把顶点交换到最后,并把最后元素除外,再进行步骤一得到第二大
注意:子父节点交换后,要判断是否对子孙节点关系有影响
#include<bits/stdc++.h>
using namespace std;void max_heapify(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 heap_sort(int arr[], int len) {//初始化,i从最後一个父节点开始调整for (int i = len / 2 - 1; i >= 0; i--)//注意理解i= len/2-1max_heapify(arr, i, len - 1);//先将第一个元素和已经排好的元素前一位做交换,再从新调整(刚调整的元素之前的元素),直到排序完毕for (int i = len - 1; i > 0; i--) {swap(arr[0], arr[i]);max_heapify(arr, 0, i - 1);}
}int main() {int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };int len = (int) sizeof(arr) / sizeof(*arr);heap_sort(arr, len);for (int i = 0; i < len; i++)cout << arr[i] << ' ';cout << endl;return 0;
}