public void mergeSort(int[] arr, int first, int last, int[] temp){
if(first<last){
int middle=(first+last)/2;
mergeSort(arr, first, middle, temp);
mergeSort(arr, middle+1, last, temp);
mergeArray(arr, first, middle, last, temp);
}
}
//将arr[first--middle]和arr[middle+1--end]两个有序序列合并
public void mergeArray(int[] arr, int first, int middle, int end, int temp[]){
int i=first, j=middle+1, k=0;
while(i<=middle&&j<=end){
if(arr[i]<arr[j]){
temp[k++]=arr[i++];
}else {
temp[k++]=arr[j++];
}
}
while(i<=middle){
temp[k++]=arr[i++];
}
while(j<=end){
temp[k++]=arr[j++];
}
//将暂存数组里有序的序列复制到arr中
for(int x=0;x<k;x++){
arr[first+x]=temp[x];
}
}
public void minHeapSort(int[] a, int n){
int temp=0;
makeMinHeap(a, n);
for(int i=n-1;i>0;i--){
temp=a[0];
a[0]=a[i];
a[i]=temp;
minHeapFixDown(a, 0, i);
}
}
//构建最小堆
public void makeMinHeap(int[] a, int n){
for(int i=(n-1)/2;i>=0;i--){
minHeapFixDown(a, i, n);
}
}
//从i节点开始调整,n为节点总数,从0开始计算,i节点的子节点为2*i+1,2*i+2
public void minHeapFixDown(int[] a, int i, int n){
int j=2*i+1; //子节点
int temp=0;
while(j<n){
//在左右子节点中寻找最小的
if(j+1<n&&a[j+1]<a[j]){
j++;
}
if(a[i]<=a[j]){
break;
}
//较大节点下移
temp=a[i];
a[i]=a[j];
a[j]=temp;
i=j;
j=2*i+1;
}
}