您的位置:首页 > 其它

堆排序

2015-12-06 23:15 357 查看
<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;
}
                                               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: