1)问题描述
就是把一个无序的数组弄成有序的。
2)基本思路
就是把一个无序的数组递归得分解成只有一个元素的数组,这样这个只有一个元素的数组就是有序的,然后再有序得合并起来。
3)代码实现
package laoya;
import java.util.Arrays;
import java.util.Scanner;
public class test {
/*
把一个数组弄成有序的
当分解到最后,只剩下一个数的时候,该数组自然就是有序的。
*/
public static void merge_sort(int a[],int first,int last,int temp[]) {
if(first<last) {
int mid=(first+last)/2;
merge_sort(a,first,mid,temp); //弄左边有序
merge_sort(a,mid+1,last,temp); //弄右边有序
merge(a,first,mid,last,temp); //将俩个有序的数组有序得合并
}
}
/*
用于把俩个本来就有序的数组合并成一个有序的数组
*/
public static void merge(int[] arr,int l,int m,int r,int[] temp){
int i=l,j=m;
int a=m+1,b=r;
int t=0;
while(i<=j && a<=b){
if(arr[i]<arr[a]){
temp[t]=arr[i];
i++;
t++;
}else{
temp[t]=arr[a];
a++;
t++;
}
}
//防止有其中一个数组还没有插入完全
while(i<=j){
temp[t]=arr[i];
i++;
t++;
}
while(a<=b){
temp[t]=arr[a];
a++;
t++;
}
//把数组复制回数组a中
for( i=0;i<t;i++) {
arr[l+i]=temp[i];
}
}
public static void main(String[] args) {
int a[]= {5,3,6,9,4,7};
int []temp=new int[6]; //把temp放在最外层,可以重复利用,防止里面递归重复建立temp的话空间复杂度就很大
merge_sort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(a));
}
}
4)时间复杂度和空间复杂度