堆及堆排序
来源:互联网 发布:常用汽车单片机 编辑:程序博客网 时间:2024/04/29 06:29
[code]
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
void createheap(vector<int> &a, int n);
void HInsert(vector<int> &a, int m);
int a[11] = {1000, 2, 6, 7, 4, 1, 8, 9, 12, 11, 23};
vector<int> b(a, a+11);
void createheap(vector<int> &a, int n)
{
for (int i=n/2; i>0; i--)
{
int key = a[i];
int temp = i;
while (2*temp <= n)
{
int j = 2 * temp;
if (j < n)
{
if (a[j] < a[j+1])
{
j = j + 1;
}
}
if (key < a[j])
{
a[temp] = a[j];
temp = j;
}
else
{
break;
}
}
a[temp] = key;
}
}
void HInsert(vector<int> &a, int m)
{
/*
a.push_back(m);
int index = a.size()-1; //可以重新建堆,但是这样做显然很浪费时间.
createheap(a, index);
*/
a.push_back(m);
int j = a.size()-1;
int key = a[j];
int t = j / 2;
while (t>0)
{
if (key > a[t])
{
a[j] = a[t];
j = t;
t = t / 2;
}
else
{
break;
}
}
a[j] = key;
}
void deleteTop(vector<int> &a)
{
int temp = a[a.size()-1];
a[a.size()-1] = a[1];
a[1] = temp;
a.pop_back();
int j = 1;
while (2*j <= a.size()-1)
{
int m = 2 * j;
if (m < a.size()-1)
{
if (a[m] < a[m+1])
{
m = m + 1;
}
}
if (temp < a[m])
{
a[j] = a[m];
j = m;
}
else
{
break;
}
}
a[j] = temp;
}
int main()
{
createheap(b, b.size()-1);
for (int i=1; i<b.size(); i++)
{
printf("%d ", b[i]);
}
HInsert(b, 133);
HInsert(b, 23);
HInsert(b, 33);
HInsert(b, 103);
HInsert(b, 15);
printf("/n");
for (int i=1; i<b.size(); i++)
{
printf("%d ", b[i]);
}
printf("/n");
deleteTop(b);
deleteTop(b);
for (int i=1; i<b.size(); i++)
{
printf("%d ", b[i]);
}
return 0;
}
[/code]
- 堆及堆排序
- 堆及堆排序
- 堆及堆排序
- 堆建立及堆排序
- 最小堆及堆排序
- 说说堆及堆排序
- 堆实现 及 堆排序
- 堆排序及应用
- 最大堆及堆排序的实现
- 最大堆及堆排序的实现
- 【算法总结】堆及堆排序总结
- 堆(数据结构)及堆排序
- Python笔记:二叉堆及堆排序
- 【算法总结】堆及堆排序总结
- 堆、堆排序及Java实现
- 堆的建立及堆排序
- 堆的使用及堆排序
- c++实现二叉堆及堆排序
- 用户出口-GUI接口增强-屏幕增强
- 记录》》public,private,protect的访问机制
- 必须掌握的八个【cmd 命令行】
- c++模板
- hibernate 中lazy作用
- 堆及堆排序
- 冷眼看PHP
- 彩信的基本原理
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- C++基本功之Operator
- BLOG
- tt
- Spring 2.0+ JRuby 快速入门一(简介)
- C++各大有名库的介绍之C++标准库