归并算法思想
1.有数组 q, 左端点 l, 右端点 r
2. 确定并且划分边界 mid
3.递归处理子问题 q[l..mid], q[mid+1..r]
4. 合并子问题
import java.util.Scanner;
public class Main{
public static void main(String []args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int []q = new int[n];
for( int i=0;i<q.length;i++){
q[i] = in.nextInt();
}
merge_sort(q,0,n-1);
for(int i=0;i<q.length;i++){
System.out.print(q[i] +" ");
}
}
public static void merge_sort(int []q,int l,int r){ //归并函数
if(l>=r) return;
int mid =(l+r)/2;
merge_sort(q,l,mid) ; //排左边,递归归并
merge_sort(q,mid + 1,r); //排右边,递归归并
int[] temp = new int[r-l+1];
int k = 0,i=l ,j =mid+1; //k表示tmp里面数的个数(两个序列合并了几个数)i是左半边的起点,j是右半边的起点
//使用双指针合并两边
while(i<=mid && j<=r)
if(q[i]<q[j]) temp [k++]= q[i++];
else temp[k++] = q[j++];
while(i<=mid) temp [k++]= q[i++];
while(j<=r) temp[k++] = q[j++];
for(i=l,j=0;i<=r;i++,j++) q[i]=temp[j]; //将排好的数从临时数组中放回原数组中
}
}