最大堆实现堆排序
2017-09-13 00:36
295 查看
堆排序(这里使用的是最大堆)
思想:1、将当前的堆转换成最大堆(从最大的非叶子结点开始,(1)判断根结点和左右结点的大小交换相互的位置,
使得该子树成为最大堆,每次交换成功后就继续往该结点的子结点去重复(1)操作,直到根结点后再去下一个非叶子结点,直到根结点)
2、转成最大堆后,每次就将第一个结点互最后一个结点进行交换,然后将整个堆的长度减去1
(因为最后一个结点就是整个数组中最大的元素,即就是已经排序好的结点)
3、重复1、2的操作,直到堆中的元素都排序好了
代码如下:
#include <iostream>
using namespace std;
int data[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };//测试示例
void ChangeMaxHead(int len)
{
//len/2代表最大的非叶子结点
for (int i = len / 2; i >= 1; i--){
int temp = i;
int maxIndex = temp;
while (true)
{
int LeftIndex = 2 * temp;
int RightIndex = 2 * temp + 1;
if (LeftIndex > len) break;//左结点不存在,意味着该结点是叶子结点
if (LeftIndex <= len && data[LeftIndex - 1] > data[maxIndex - 1]){//左结点存在并且值大于根结点
maxIndex = LeftIndex;
}
if (RightIndex <= len && data[RightIndex - 1] > data[maxIndex - 1]){//右结点存在并且值大于根结点
maxIndex = RightIndex;
}
if (maxIndex != temp){//交换两个结点
int swapV = data[temp - 1];
data[temp - 1] = data[maxIndex - 1];
data[maxIndex - 1] = swapV;
temp = maxIndex;
}
else break;
}
}
}
void Head_Sort(int len)
{
ChangeMaxHead(len);
for (int i = len - 1; i > 0; i--)
{
int temp = data[0];
data[0] = data[i];
data[i] = temp;
ChangeMaxHead(i);
}
}
int main()
{
Head_Sort(9);
for (int i = 0; i < 9; i++)
{
printf("%d ", data[i]);
}
puts("");
return 0;
}
//输出 10 20 30 40 50 60 70 80 90
思想:1、将当前的堆转换成最大堆(从最大的非叶子结点开始,(1)判断根结点和左右结点的大小交换相互的位置,
使得该子树成为最大堆,每次交换成功后就继续往该结点的子结点去重复(1)操作,直到根结点后再去下一个非叶子结点,直到根结点)
2、转成最大堆后,每次就将第一个结点互最后一个结点进行交换,然后将整个堆的长度减去1
(因为最后一个结点就是整个数组中最大的元素,即就是已经排序好的结点)
3、重复1、2的操作,直到堆中的元素都排序好了
代码如下:
#include <iostream>
using namespace std;
int data[] = { 50, 10, 90, 30, 70, 40, 80, 60, 20 };//测试示例
void ChangeMaxHead(int len)
{
//len/2代表最大的非叶子结点
for (int i = len / 2; i >= 1; i--){
int temp = i;
int maxIndex = temp;
while (true)
{
int LeftIndex = 2 * temp;
int RightIndex = 2 * temp + 1;
if (LeftIndex > len) break;//左结点不存在,意味着该结点是叶子结点
if (LeftIndex <= len && data[LeftIndex - 1] > data[maxIndex - 1]){//左结点存在并且值大于根结点
maxIndex = LeftIndex;
}
if (RightIndex <= len && data[RightIndex - 1] > data[maxIndex - 1]){//右结点存在并且值大于根结点
maxIndex = RightIndex;
}
if (maxIndex != temp){//交换两个结点
int swapV = data[temp - 1];
data[temp - 1] = data[maxIndex - 1];
data[maxIndex - 1] = swapV;
temp = maxIndex;
}
else break;
}
}
}
void Head_Sort(int len)
{
ChangeMaxHead(len);
for (int i = len - 1; i > 0; i--)
{
int temp = data[0];
data[0] = data[i];
data[i] = temp;
ChangeMaxHead(i);
}
}
int main()
{
Head_Sort(9);
for (int i = 0; i < 9; i++)
{
printf("%d ", data[i]);
}
puts("");
return 0;
}
//输出 10 20 30 40 50 60 70 80 90
相关文章推荐
- c++实现最大堆建立(链表结构)和堆排序
- 堆排序原理及算法实现(最大堆)
- 最大堆及堆排序的实现
- 最大堆实现堆排序
- java实现最大堆及堆排序
- 堆排序实现百万级数据取若干数量的最大数字(java)
- 堆排序原理及算法实现(最大堆)
- 堆排序原理及算法实现(最大堆)
- 第6章 堆排序 java实现 简单版 泛型版 最大优先级队列
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- 最大堆及堆排序的实现
- [151225] Python3 实现最大堆、堆排序,解决TopK问题
- 大数据处理堆实现N个数据找K个最大数据和堆排序
- 堆排序原理及算法实现(最大堆)
- 堆排序原理及算法实现(最大堆)
- 堆与堆排序,最大索引堆(python实现)
- 计算机算法--最大堆实现堆排序(从大到小输出)
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 最大堆及堆排序的Java实现_world
- C++实现数组最大堆排序