#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//int partion(vector<int>&, int, int);
void StackSort(vector<int>&, int, int);
void heapify(vector<int>& num, int left, int right);
int main()
{
vector<int>num{6, 5, 0, 5, 5, 5, 7, 8};
int num1[]{21, 13, 10, 2};
int left, right;
left = 0;
right = num.size();
int size = right;
for(; left < right; left++)
StackSort(num, left, right);
for(int i = 0; i < num.size(); i++)
cout << num.at(i) << " ";
cout << endl;
swap(num[0], num[--size]); //大根堆
while(size > 0)
{
heapify(num, 0, size);
swap(num[0], num[--size]);
}
for(int i = 0; i < num.size(); i++)
cout << num.at(i) << " ";
return 0;
}
void StackSort(vector<int>&num, int left, int right)
{
while(num[left] > num[(left - 1)/2])
{
swap(num[left], num[(left - 1)/2]);
left = (left - 1)/2;
}
}
void heapify(vector<int>& arr, int index, int size)
{
int left = index * 2 + 1; //index位置的子节点
while (left < size) {
int largest = left + 1 < size
//** index 右孩子位置 */
&& arr[left + 1] > arr[left] ? left + 1 : left;
// 左右两个孩子最大值下标 largest
largest = arr[largest] > arr[index] ? largest : index;
//找 index 和 左右两个孩子 的最大值
if (largest == index) {
break;
}
swap(arr[largest] , arr[index]);
index = largest;
left = index * 2 + 1;
}
}
C++算法(5) 堆排序
最新推荐文章于 2024-06-06 09:34:24 发布