您的位置:首页 > 其它

堆及堆排序

2008-11-17 20:05 10 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: