先理解下什么叫堆,然后下理解代码:https://www.cnblogs.com/chengxiao/p/6129630.html(Ctrl+鼠标左键)
using namespace std;
#include<string.h>
#include<assert.h>
#include <algorithm>
#include <iostream>
void BuildSmallHeap(char* arr, int n, int parent) //向下调整
{
int child = parent * 2 + 1; //子节点(左节点)
while (child<n){
if (child+1<n&&arr[child + 1]>arr[child]) //child为左节点,判断左右节点大小保证右节点在排序序列内
{
child++; //如果右节点大于左节点,左节点++
}
if (arr[child] > arr[parent]){ //判断子节点是否大于父节点
swap(arr[child], arr[parent]);
parent = child; child = parent * 2 + 1;
}
else{
break; //如果大于交换
} // child赋值后大于n,跳出循环
}
}
void HeapSort(char* arr,int len){
assert(arr);
assert(len);
int parent = (len - 2) >> 1; // 找出第一个非叶节点 len/2-1也可以,且循环所有的非叶节点,此次循环为3次,parent=2
for (; parent >= 0; --parent){
BuildSmallHeap(arr, len, parent);
}
for (int i = len-1; i >=0;i--){
//保证最后一个数为最大的,且除了最后一个数,重新循环建立小堆
swap(arr[0], arr[i]); //堆顶与最后一个数交换
BuildSmallHeap(arr, i, 0);
}
}
int main(){
char arr[] = "512784";
int len = sizeof(arr) - 1;
HeapSort(arr, len);
cout << len << endl;
cout << arr << endl;
system("pause");
return 0;
}
结果: