堆排序(结合分治法)
1)合并堆:
public static void Merge(int []a,int p,int q,int r) {
int ln=q-p+2;
int rn=r-q+1;
int []L=new int[ln];
int []R=new int[rn];
int i,j;
for(i=0;i<ln-1;i++)
L[i]=a[p+i];
L[ln-1]=Integer.MAX_VALUE; //设置最后一个元素为哨兵
for(j=0;j<rn-1;j++)
R[j]=a[q+j+1];
R[rn-1]=Integer.MAX_VALUE;
i=0;
j=0;
for(int k=p;k<=r;k++) {
if(L[i]<=R[j]) {
a[k]=L[i];
i++;
}
else {
a[k]=R[j];
j++;
}
}
}
2)分治进行归并排序
public static void MergeSort(int []a,int p,int r) {
if(p<r) {
int q=(p+r)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
}