#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]<<" "; }