堆排序 图解 (网上摘抄)(方便查询)
2016-06-18 17:52
323 查看
数据结构中的堆和操作系统中的堆、堆栈(栈)是没有关系的,大家不要像我一样有误解。
数据结构中的堆分两种:大(顶)堆和小(顶)堆,简单来说就是
〇 。
O O O O
。 。 。 。 (大堆) 〇 〇 〇 〇(小堆)这个意思。
一般用二叉树来描述这种数据结构,存储可以用数组。
下面是排序思路:
(图):
C++代码:
[cpp] view
plaincopy
#include <iostream>
#include <algorithm>
using std::cout;
using std::cin;
using std::endl;
template<class T>
class Out{
public:
void operator()(T o)
{
cout<<o<<'\t';
}
};
template<class T>
void Swap(T& a,T&b)
{
T t=a;
a=b;
b=t;
}
inline int Rt(int idx)
{
return (idx<<1)+2;
}
inline int Lt(int idx)
{
return (idx<<1)+1;
}
template<class T>
void HeapBuild(T* A,int idx,int size)
{
int child;
for(;idx<=size/2;idx=child)
{
child=Lt(idx);
if (child<size&&A[child]>A[idx])
{
Swap(A[idx],A[child]);
}
child=Rt(idx);
if (child<size&&A[child]>A[idx])
{
Swap(A[idx],A[child]);
}
}
}
template<class T>
void HeapSort(T* A,int size)
{
for (int i=size/2;i>=0;i--)
{
HeapBuild(A,i,size);
}
for (int i=size-1;i>=0;i--)
{
Swap(A[0],A[i]);
HeapBuild(A,0,i);
}
}
int main()
{
int size=0;
cout<<"enter elements count num:"<<endl;
cin>>size;
int* elems = new int[size];
cout<<"Input all elements to be sort:"<<endl;
for(int i=0;i<size;cin>>elems[i++]);
HeapSort(elems,size);
std::for_each(elems,elems+size,Out<int>());
delete []elems;
}
数据结构中的堆分两种:大(顶)堆和小(顶)堆,简单来说就是
〇 。
O O O O
。 。 。 。 (大堆) 〇 〇 〇 〇(小堆)这个意思。
一般用二叉树来描述这种数据结构,存储可以用数组。
下面是排序思路:
(图):
C++代码:
[cpp] view
plaincopy
#include <iostream>
#include <algorithm>
using std::cout;
using std::cin;
using std::endl;
template<class T>
class Out{
public:
void operator()(T o)
{
cout<<o<<'\t';
}
};
template<class T>
void Swap(T& a,T&b)
{
T t=a;
a=b;
b=t;
}
inline int Rt(int idx)
{
return (idx<<1)+2;
}
inline int Lt(int idx)
{
return (idx<<1)+1;
}
template<class T>
void HeapBuild(T* A,int idx,int size)
{
int child;
for(;idx<=size/2;idx=child)
{
child=Lt(idx);
if (child<size&&A[child]>A[idx])
{
Swap(A[idx],A[child]);
}
child=Rt(idx);
if (child<size&&A[child]>A[idx])
{
Swap(A[idx],A[child]);
}
}
}
template<class T>
void HeapSort(T* A,int size)
{
for (int i=size/2;i>=0;i--)
{
HeapBuild(A,i,size);
}
for (int i=size-1;i>=0;i--)
{
Swap(A[0],A[i]);
HeapBuild(A,0,i);
}
}
int main()
{
int size=0;
cout<<"enter elements count num:"<<endl;
cin>>size;
int* elems = new int[size];
cout<<"Input all elements to be sort:"<<endl;
for(int i=0;i<size;cin>>elems[i++]);
HeapSort(elems,size);
std::for_each(elems,elems+size,Out<int>());
delete []elems;
}
相关文章推荐
- 【心得】centos 去除屏幕保护
- zepto商城顶部分类导航下拉菜单代码
- 词组缩写 英语句子所有单词首字母大写输出 C语言/C++编程题
- 面向对象 课堂基础笔记
- Struts2基础
- 正则表达式
- iOS:Objective-C字面量
- Xshell连接centos操作
- Textview换行显示—换行符
- 背景图片跟随手势滑动的ViewPager
- Codeforces Round #356 (Div. 2)E. Bear and Square Grid
- 项目51-处理C++源代码的程序
- 快速入门:十分钟学会Python
- 矩阵链乘最优化实现
- c#获取console类进程程序的显示数值
- DRP(五)——JSP与JavaBean
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- 源码包安装
- [转]ORA-12560: TNS: 协议适配器错误
- 基本分页存储管理方式