算法导论第六章堆排序算法实现

#include<iostream>
using namespace std;


using namespace std;


const int maxn = 10010;


#define PARENT(i) i/2
#define LEFT(i) i<<1
#define RIGHT(i) (i<<1)+1


int heap[maxn];
int hsize = 0;
int n;
void MAXHEAPIFY(int *A, int key)
{
int l = LEFT(key);
int r = RIGHT(key);
int largest = 0;
if (l <= hsize&&A[key] < A[l])
{
largest = l;
}
else largest = key;
if (r <= hsize&&A[largest] < A[r])
largest = r;
if (largest != key)
{
int temp = A[key];
A[key] = A[largest];
A[largest] = temp;
MAXHEAPIFY(A, largest);
}
}


void BUILDMAXHEAP(int *A)
{
for (int i = hsize / 2; i >= 1; i--)
MAXHEAPIFY(A, i);
}


void HEAPSORT(int *A)
{
for (int i = n; i > 1; i--)
{
int temp = heap[1];
heap[1] = heap[i];
heap[i] = temp;
hsize--;
MAXHEAPIFY(A, 1);
}
}




int HEAP_MAXIMUM(int *A)
{
return A[1];
}


int  HEAP_EXTRACT_MAX(int *A)
{
if (hsize < 1)cout << "error";
int max = A[1];
A[1] = heap[hsize];
hsize--;
MAXHEAPIFY(A, 1);
return max;
}




bool HEAP_INCREACSE_KEY(int *A, int i, int key) {
if (key < A[i])return false;
A[i] = key;
while (i > 1 && A[PARENT(i)] < A[i])
{
int temp = A[PARENT(i)];
A[PARENT(i)] = A[i];
A[i] = temp;
i = PARENT(i);
}
}


bool HEAP_INSERT(int *A, int key)
{
hsize++;
A[hsize] = INT_MIN;
HEAP_INCREACSE_KEY(A, hsize,key);
return true;
}


int main()
{
freopen("in.txt", "r", stdin);


cin >> n;
hsize = n;
for (int i = 1; i <= n; i++)
cin >> heap[i];
BUILDMAXHEAP(heap);

//HEAPSORT(heap);

for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
cout << endl;
cout << HEAP_EXTRACT_MAX(heap) << endl;


HEAP_INSERT(heap, 10);


for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
return 0;
}

猜你喜欢

转载自blog.csdn.net/PAN_Andy/article/details/72983967
今日推荐