用最大堆實現排序
#include<iostream> // Myself 15-9-26 update Adjust_Heap_2() 15-10-29
#include<cstdio>
using namespace std;
void Adjust_Heap(int* a,int i,int n) { // 調整最大堆 遞歸方法
if (i > n/2) return ; // 葉子節點 無需調整
int le = i<<1;
int ri = i<<1|1;
int Max = i;
if (le <= n && a[le] > a[Max]) Max = le;
if (ri <= n && a[ri] > a[Max]) Max = ri;
if (Max != i) {
swap(a[Max],a[i]);
Adjust_Heap(a,Max,n);
}
}
void Adjust_Heap_2(int* a,int i,int n)// 調整最大堆 非遞歸方法
{
if (i > n/2) return ;
int parent = i , child;
int temp = a[i];
for (;parent <= n/2; parent = child) {
child = parent<<1;
if (child +1 <= n && a[child] < a[child + 1]) {
child ++; // child指向值較大的孩子
}
if (temp > a[child]) break;
else a[parent] = a[child];
}
a[parent] = temp;
}
void Build_Heap(int* a,int n) { // 建一個最大堆
for (int i = n/2;i > 0;i--)
Adjust_Heap(a,i,n);
}
void Heap_sort(int* a,int n) // 堆排序
{
Build_Heap(a,n); // 建堆
for (int i = n;i > 1;i--) {
swap(a[i],a[1]);
Adjust_Heap_2(a,1,i - 1);
}
}
int main()
{
int a[] = {0,7,1,5,2,3,4,9,6,10,8};
int n = 10;
//cin>>n;
//for(int i=1;i <= n;i++) cin>>a[i];
Heap_sort(a,n);
for (int i = 1;i <= n;i++)
cout<<a[i]<<" ";
return 0;
}
#include<iostream> // 優先級對列 priority_queue 最大優先隊列 Myself 15-9-26
#include<cstdio>
using namespace std;
void Adjust_Heap(int* a,int i,int n) { // 調整最大堆
if (i > n/2) return ; // 葉子節點 無需調整
int le = i*2;
int ri = i*2+1;
int Max = i;
if (le <= n && a[le] > a[Max]) Max = le;
if (ri <= n && a[ri] > a[Max]) Max = ri;
if (Max != i) {
swap(a[Max],a[i]);
Adjust_Heap(a,Max,n);
}
}
void Build_Heap(int* a,int n) { // 建一個最大堆
for (int i = n/2;i > 0;i--)
Adjust_Heap(a,i,n);
}
/*
void Heap_sort(int* a,int n) // 堆排序
{
Build_Heap(a,n);
for (int i = n;i > 1;i--) {
swap(a[i],a[1]);
Adjust_Heap(a,1,i - 1);
}
}
*/
/**============*/
int Maximun(int* a) { //返回最大值
return a[1];
}
int Extract_Max(int* a,int& n) { // 返回並去電最大元素
if (n <= 0) {
cout<<"Extract Error"<<endl;
return -1;
}
int Max = a[1];
a[1] = a[n];
n --;
Adjust_Heap(a,1,n);
return Max;
}
void Insert(int* a,int x,int& n) { // 增加一個元素
a[++n] = x;
int i = n;
int parent = i>>1 ;
while (parent >= 1 && a[parent] < a[i] ) { //與父節點比較
swap(a[parent], a[i]);
i = parent;
parent = i>>1;
}
}
void print(int *a,int n) {
for (int i = 1;i <= n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
int a[1000] = {0,7,1,5,2,3,4,9,6,10,8};
int n = 10;
//cin>>n;
//for(int i=1;i <= n;i++) cin>>a[i];
Build_Heap(a,n);// 堆排序
print(a,n);
cout<<Maximun(a)<<endl;
print(a,n);
cout<<Extract_Max(a,n)<<endl;
print(a,n);
Insert(a,11,n);
print(a,n);
return 0;
}