理解学习堆排序后,自行敲了一遍代码,做个记录,以下为大顶堆
其时间复杂度最好与最坏的情况下均为O(nlogn)。
堆排序:(假设利用大顶堆)将待排序的序列构成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点,将它一走,其实就是将其与对数组的末尾元素交换,此时末尾元素就是最大值,然后将剩余n-1个序列重新构成一个堆,就会得到n个元素中的次大值,反复执行,就可以达到一个有序序列。
#include<iostream>
#include<vector>
using namespace std;
void swap(vector<int> &L, int i, int j)
{
int tmp = L[i];
L[i] = L[j];
L[j] = tmp;
}
void HeapAdjust(vector<int> &L, int s, int m)//堆调整
{
int tmp, j;
tmp = L[s];
for (j = 2 * s + 1; j<m; j = j * 2 + 1)
{
//如果左树元素小于右树元素,j加1
if (j + 1<m&& L[j] < L[j + 1])
{
j = j + 1;
}
//如果父节点元素小于子树最大值,则交换
if (tmp < L[j])
{
swap(L, s, j);
}
else //否则无需交换,直接结束当前节点的调整
break;
s = j; //若进行了交换,则将之前堆顶元素的新下标赋给s,继续检查堆顶元素来到新