C++堆排序模板
#pragma warning(disable : 4996)
#include<iostream>
#include<vector>
#define ARRAY vector<int> //下标从0开始有效
using namespace std;
//调整最大堆(升序)
void heapAdjust(ARRAY *ary, int root, int tail){ //不包括tail
for (int i = root * 2 + 1; i < tail; i = i * 2 + 1){
i += (ary->at(i + 1) > ary->at(i) ? 1 : 0);
if (ary->at(root) > ary->at(i)) break;
swap(ary->at(root), ary->at(i));
root = i;
}
return;
}
//调整最小堆(降序)
void heapAdjust2(ARRAY *ary, int root, int tail){
for (int i = root * 2; i < tail; i = i * 2 + 1){
i += (ary->at(i+1) < ary->at(i) ? 1 : 0);
if (ary->at(root) < ary->at(i)) break;
swap(ary->at(root), ary->at(i));
root = i;
}
return;
}
//堆排序,改变adjust函数即可调整升序或降序
void HeapSortInsc(ARRAY* ary){
int size = ary->size();
for (int i = size / 2 - 1; i >= 0; i--){
heapAdjust2(ary, i, size);
}
for (int i = size - 1; i > 0; i--){
swap(ary->at(0), ary->at(i));
heapAdjust2(ary, 0, i - 1); //注意是i-1
}
return;
}
void printArray(ARRAY *ary){
for (auto i = ary->begin(); i < ary->end(); i++){
cout << *i << " ";
}
cout << endl;
return;
}
int main(){
ARRAY ary{ 20, 30, 90, 40, 70, 110, 60, 10, 100, 50, 80 };
printArray(&ary);
HeapSortInsc(&ary);
printArray(&ary);
return 0;
}
原来堆排序这么简单。。。。。