选择排序算法有简单选择排序,堆排序算法,堆排序是对简单选择排序的改进
今天动手实现了一下简单选择排序算法
假设数组是从下标0开始的。
void Sift(vector<int> & nums, int i, int end)
{
// i 要调整的结点位置, end 待调整序列结束位置
int j = 2 * i + 1;
while (j <= end)
{
//这里很巧妙,j指向两个孩子中的较大者
if (j < end && nums[j] < nums[j + 1]) ++j;
if (nums[i] < nums[j])
{
std::swap(nums[i], nums[j]);
}
// 上面只交换了i,j,另一个孩子没有动,说明它还是堆结构,所以这里接着调整j
i = j;
j = 2 * j + 1;
}
}
void heapSort(vector<int> &v)
{
// 初始建堆
for (int i = v.size() / 2; i >= 0; --i)
Sift(v, i, v.size() - 1);
// 调整堆
for (int i = v.size() - 1; i > 0; --i)
{
swap(v[0], v[i]);
Sift(v, 0, i - 1);
}
}