<span style="font-size:18px;">堆排序可以分为两步,第一步将待排序序列构建为一个大顶堆;第二步将每个最大值的根结点与末尾元素交换,并将剩余元素重新调整为大顶堆。</span>
</pre><pre name="code" class="html">#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
#define random(x) (rand()%x)
void heap_adjust(vector<int>& nums, int index, int length)
{
for(int i = 2 * index; i <= length; i *= 2)
{
int temp = nums[index];
if(i < length && nums[i] < nums[i+1])
i++;
if(temp >= nums[i]) break;
nums[index] = nums[i];
nums[i] = temp;
index = i;
}
}
void heap_sort(vector<int>& nums)
{
int len = nums.size() - 1;
for(int i = len / 2; i > 0; i--)
{
heap_adjust(nums, i, len);
}
for(int i = len; i > 1; i--)
{
int temp = nums[1];
nums[1] = nums[i];
nums[i] = temp;
heap_adjust(nums, 1, i - 1);
}
}
void print_num(vector<int>& nums)
{
int len = nums.size();
for(int i = 1; i < len; i++)
cout << nums[i] << ' ';
cout << endl;
}
int main()
{
vector<int> nums;
nums.push_back(0);
for(int i = 0; i < 10; i++)
{
int num = random(10);
nums.push_back(num);
}
print_num(nums);
heap_sort(nums);
print_num(nums);
return 0;
}