#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;
void AdjustDown(int A[],int k,int n){
A[0]=A[k];
for(int i=2*k;i<=n;i*=2){
if(i<n&&A[i]<A[i+1])
i++;//此时i表示k的子树,此处比较出左右子树中较大的那个进行交换
if(A[0]>=A[i]) break;//如果父节点大于子节点不进行交换
else{
A[k]=A[i];
k=i;//进行交换
}
}
A[k]=A[0];
}
/*
根据完全二叉树的性质,最后一个元素(i)的父节点应该是i/2向下取整。
我们只比较第1到i/2个元素及其子节点关键字的大小就能比较所有的数
在函数执行一遍之后只找到一个最大的值,并不能保证完全二叉树按后序遍历一样严格排列
*/
void BuildMaxHeap(int A[],int n){
for(int i=n/2;i>0;i--) //从i/2到1比较
AdjustDown(A,i,n);
}
void HeapSort(int A[],int n){
BuildMaxHeap(A,n);
for(int i=n;i>1;i--){
int temp=A[1];
A[1]=A[i];
A[i]=temp;
cout<<temp<<" ";//执行至此一个最大只已经找到进行输出
AdjustDown(A,1,i-1);//如果不进行输出而是在函数执行结束之后输出的话将是递增数组
//因为在此处输出之后将会用最大值和最小值进行交换
}
}
int main(){
int A[]={0,53,17,78,54,77,33,55,6,9,45,65,87,32}; //A[0]为辅助空间
HeapSort(A,14);
return 0;
}
#include<iostream>
using namespace std;
const int maxn=100;
void merge1(int A[],int L1,int R1,int L2,int R2){
int i=L1,j=L2;
int temp[maxn],index=0;
while(i<=R1&&j<=R2){
if(A[i]<=A[j]) temp[index++]=A[i++];
else temp[index++]=A[j++];
}
while(i<=R1) temp[index++]=A[i++];
while(j<=R2) temp[index++]=A[j++];
for(int i=0;i<index;i++)
A[L1+i]=temp[i];
}
void mergeSort1(int A[],int left,int right){
if(left<right){
int mid=(left+right)/2;
mergeSort1(A,left,mid);
mergeSort1(A,mid+1,right);
merge1(A,left,mid,mid+1,right);
}
}
//0 8
//0 4 5 8
//0 2 3 5 6 8
//0 1 1 2 3 4 5 6 7 8
void merge2(int A[],int L1,int R1,int L2,int R2){
int i=L1,j=L2;
int temp[maxn],index=0;
while(i<=R1&&j<=R2){
if(A[i]<=A[j]) temp[index++]=A[i++];
else temp[index++]=A[j++];
}
while(i<=R1) temp[index++]=A[i++];
while(j<=R2) temp[index++]=A[j++];
for(int i=0;i<index;i++)
A[L1+i]=temp[i];
}
void mergeSort2(int A[],int n){
for(int step=2;step/2<=n;step*=2){
for(int i=0;i<=n;i+=step){
int mid=i+step/2-1;
if(mid+1<=n)
merge2(A,i,mid,mid+1,min(i+step-1,n));
}
}
}
int main(){
int A[9]={31,87,4,65,1,5,65,513,351};
mergeSort1(A,0,8);
mergeSort2(A,9);
for(int i=0;i<10;i++)
cout<<A[i]<<" ";
}