C ++ Heapsort引发错误

时间:2015-04-10 21:37:10

标签: c++ heap heapsort

这是我的完整实现代码,附带一些注释。我尝试从这里和那里收集一些代码

#include <iostream>
#include <math.h> 
#include <conio.h>
#include "Header.h"
using namespace std;
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
heap::heap()
{
/*
int x[10] = { 1, 12, 33, 44, 2, 6, 7, 8, 9, 10 };
heapsize = 10;
SetData(x);
*/
}
bool heap::empty()
{
return heapsize == 0;
}
int heap::parent(int index)
{
int x;
if (index % 2 == 0)
{
    x = ((index - 1) / 2);
}
else
{
    x = (index / 2);
}
return x;
}
int heap::left(int index)
    {
int a;
a = 2 * index ;
    return a;
    }
    int heap::right(int index)
    {
int a;
a = 2 * index + 1 ;
return a;
}

void heap::Heapify(int i)
{
int temp, l, r, largest;
l = left(i);
r = right(i);
if ((l <= heapsize) && (A[l] > A[i]))
    largest = l;
else largest = i;
if ((r <= heapsize) && (A[r] > A[largest]))
    largest = r;
if (i != largest)
{
    //swap(A[i], A[largest]);
    temp = A[i];
    A[i] = A[largest];
    A[largest] = temp;
    Heapify(largest);
}
}
void heap::Buildheap()
{
for (int i = heapsize ; i > 0; i--)
    Heapify(i);
}

void heap::insert()
{
int insert;
heapsize = (heapsize + 1);
cout << "insert please:" << endl;
cin >> insert;
int temp = insert;
Buildheap();
cout << "Done!" << endl;
}
void heap::viewheap()
{
Buildheap();

for (int count = 0; count <= heapsize ; count++)
{
    cout << A[count]<<" ";
}
cout << endl << endl;
}
void heap::heapsort()
{
Buildheap();
int temp;
for (int i = 0; i < heapsize; i++)
{
    //temp = A[heapsize -1];
    //A[heapsize -1] = A[0];
    //swap(A[1], A[i]);
    swap(A[1], A[i]);
    heapsize--; 
    Heapify(1);
    /*
    temp = A[heapsize - 1];
    A[heapsize - 1] = A[0];
    heapsize--;
    Buildheap();
    */
}
viewheap();
}
int heap::getmax(int)
{
int temp;
if (empty())
    cout << "Queue is EMPTY!" << endl;
else
{
    Buildheap();
    temp = A[0];
}
return temp;
}
void heap::rmax()
{
if (empty())
    cout << "Queue is EMPTY!" << endl;
else
{
    Buildheap();
    A[0] = A[heapsize];
    heapsize--;

    Heapify(0);
}
}
void heap::SetData(int x[])
{
for (int i = 0; i <= (heapsize); i++)
{
    A[i] = x[i];
}
}

这是我的标题:

class heap
{
private:
int parent(int);
int left(int);
int right(int);
void Buildheap();

void Heapify(int);
public:
int A[100];
heap();
void insert();
bool empty();
void heapsort();
int getmax(int);
void rmax();
int heapsize;
void viewheap();
void SetData(int[]);
};

我的代码出错。

2 个答案:

答案 0 :(得分:0)

在实施父项而不是

 int heap::parent(int index){
    int x;
    if (index % 2 == 0){
      x = ((index - 1) / 2);
    } else {
      x = (index / 2);
    }
    return x;
 }

你可以简单地写

  int heap::parent(int index){
    return index / 2;
 }

在方法插入中,您从控制台读取新的int,然后调用方法Build而不传递任何东西,因此方法Build不知道有关int&#39; insert&#39;的任何信息。     如果要插入新元素,则遍历整个数组并为每个索引调用Heapify。所以在你的算法中插入新元素需要nlogn时间复杂度,这是非常巨大的,在堆中插入一个元素可能会在logn时间内完成。您只需要查看在堆中插入的算法。 这是一些描述插入指令的演示 http://upload.wikimedia.org/wikipedia/commons/4/4d/Heapsort-example.gif

也是heapsort算法

http://en.wikipedia.org/wiki/Heapsort

答案 1 :(得分:0)

h :: insert()似乎没有在数据结构中插入任何内容。

我无法得到一个有效的例子。 你会这么善良,并提供输出错误的最小例子。