排序算法:堆排序
2017-03-16 08:47
337 查看
在没有学习堆排序算法的时候,将堆排序理解成了二叉排序树。
堆的定义为:二叉树中任意具有子节点的节点,它的两个子节点的元素值都不大于(或不小于)当前节点的元素值,称为大顶堆(或小顶堆);
那么堆排序算法的基本原理是每次构造一个小顶堆,那么堆的根节点就是序列的最小值,然后利用剩余的元素再构造一个小顶堆,获得第二个较小的元素,递归运行直到剩余1个元素返回,最终将得到升序排列的序列。
C++代码实现:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void HeapSort(T* vec, int VSize);
int main()
{
int att[] = { 10, 4, 23, 46, 20, 5, 3, 88, 8, 44, 53, 25, 86, 32, 16, 11, 100, 42, 17 };
int VSize = sizeof(att) / sizeof(int);
HeapSort(att, VSize);
for (int vIdx = 0; vIdx < VSize; vIdx++)
cout << "vIdx = " << vIdx << " value = " << att[vIdx] << endl;
return 0;
}
template<typename T>
void HeapSort(T* vec, int VSize)
{
if (VSize <= 1)
return;
// Create Heap
for (int vIdx = 0; vIdx < VSize/2; vIdx++)
{
bool upgrade = false;
if ((vIdx * 2 + 1 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 1]))
{
vec[vIdx] ^= vec[vIdx * 2 + 1];
vec[vIdx * 2 + 1] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 1];
upgrade = true;
}
int tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}
if ((vIdx * 2 + 2 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 2]))
{
vec[vIdx] ^= vec[vIdx * 2 + 2];
vec[vIdx * 2 + 2] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 2];
upgrade = true;
}
tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}
}
HeapSort(vec + 1, VSize - 1);
//for (int vIdx = 0; vIdx < VSize; vIdx++)
//{
// cout << "vIdx = " << vIdx << " value = " << vec[vIdx] << endl;
//}
return;
}
堆的定义为:二叉树中任意具有子节点的节点,它的两个子节点的元素值都不大于(或不小于)当前节点的元素值,称为大顶堆(或小顶堆);
那么堆排序算法的基本原理是每次构造一个小顶堆,那么堆的根节点就是序列的最小值,然后利用剩余的元素再构造一个小顶堆,获得第二个较小的元素,递归运行直到剩余1个元素返回,最终将得到升序排列的序列。
C++代码实现:
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
void HeapSort(T* vec, int VSize);
int main()
{
int att[] = { 10, 4, 23, 46, 20, 5, 3, 88, 8, 44, 53, 25, 86, 32, 16, 11, 100, 42, 17 };
int VSize = sizeof(att) / sizeof(int);
HeapSort(att, VSize);
for (int vIdx = 0; vIdx < VSize; vIdx++)
cout << "vIdx = " << vIdx << " value = " << att[vIdx] << endl;
return 0;
}
template<typename T>
void HeapSort(T* vec, int VSize)
{
if (VSize <= 1)
return;
// Create Heap
for (int vIdx = 0; vIdx < VSize/2; vIdx++)
{
bool upgrade = false;
if ((vIdx * 2 + 1 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 1]))
{
vec[vIdx] ^= vec[vIdx * 2 + 1];
vec[vIdx * 2 + 1] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 1];
upgrade = true;
}
int tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}
if ((vIdx * 2 + 2 < VSize) && (vec[vIdx] > vec[vIdx * 2 + 2]))
{
vec[vIdx] ^= vec[vIdx * 2 + 2];
vec[vIdx * 2 + 2] ^= vec[vIdx];
vec[vIdx] ^= vec[vIdx * 2 + 2];
upgrade = true;
}
tmpIdx = vIdx;
while (upgrade)
{
upgrade = false;
if (tmpIdx > 0)
{
if (vec[tmpIdx] < vec[tmpIdx / 2])
{
vec[tmpIdx] ^= vec[tmpIdx / 2];
vec[tmpIdx / 2] ^= vec[tmpIdx];
vec[tmpIdx] ^= vec[tmpIdx / 2];
upgrade = true;
tmpIdx /= 2;
}
}
}
}
HeapSort(vec + 1, VSize - 1);
//for (int vIdx = 0; vIdx < VSize; vIdx++)
//{
// cout << "vIdx = " << vIdx << " value = " << vec[vIdx] << endl;
//}
return;
}
相关文章推荐
- 排序算法:堆排序
- 浅析各类排序算法(七) 选择类排序之堆排序
- 排序算法_堆排序(最大堆、最小堆)
- 排序算法4-堆排序
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- 基本排序算法--堆排序
- golang实现常用排序算法 --- 快速排序、堆排序等
- 【排序算法】——堆排序
- 排序算法之堆排序
- 排序算法(四)、选择排序 —— 简单选择排序 和 堆排序
- java排序算法之堆排序
- 常用排序算法C++实现(堆排序,快速排序,归并排序,基数排序)
- 【排序算法】之堆排序的实现
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- 排序算法(6)堆排序
- 【排序算法】堆排序原理及Java实现
- 排序算法之直接插入、希尔排序、堆排序三者比较
- 排序算法-选择排序之堆排序
- 排序算法---堆排序
- 排序算法(归并排序, 快速排序, 堆排序)