归并排序
1:思路是分治法,和快速排序类似
2:写两个方法,方法一是可以将一个两边分别有序的数组整体排好序。
方法二是可以将一个数组左边排好序,右边也排好序,再调用方法一,不就整个数组排好序了吗?
方法二是一个递归方法,不停调用自己,将一个数组不停拆分,直到传进来的数组唯一,这不就有序了吗?
3:代码实现
public static void main(String[] args) {
// TODO
Auto-generated method stub
int[] a={
5,6,7,8,1,2,3,4
};
MergeSort mergeSort=new MergeSort();
mergeSort.sort(a,0,a.length-1);
for (int i : a) {
System.out.print(i);
}
}
/**
* 给我一个两边有序的数组,告诉我区别两边数组的中间索引,我就可以将整个数组排好序
* @param a
* @param left
* @param middle
* @param right
*/
public void mergeSort(int[] a,int left,int middle,int right){
int leftSize=middle-left;
int rightSize=right-middle+1;
int[] leftArr=new int[leftSize];
int[] rightArr=new int[rightSize];
int i,j,k;
for(i=left;i<middle;i++){
leftArr[i-left]=a[i];
}
for(i=middle;i<right+1;i++){
rightArr[i-middle]=a[i];
}
i=0;j=0;k=left;
while(i<leftSize&&j<rightSize){
if(leftArr[i]<rightArr[j]){
a[k]=leftArr[i];
k++;
i++;
}else{
a[k]=rightArr[j];
k++;
j++;
}
}
while(i<leftSize){
a[k]=leftArr[i];
k++;
i++;
}
while(j<rightSize){
a[k]=rightArr[j];
k++;
j++;
}
}
/**
* 这个方法抽象一下就是传入一个数组和两端索引,将左边排好序,右边也排好序,再将这个数组整体排好序
* 当left==right时,显然只有一个数了,一个数不就是排好序了吗?返回就行了
* @param a
* @param left
* @param right
*/
public void sort(int[] a,int left,int right){
if(left==right){
return;
}
int middle=(left+right)/2;
//这里显然如果数组是奇数,中间的归左边数组,如果是偶数,两边平分
sort(a,left,middle);
sort(a,middle+1,right);
//因为这个方法一开始写的时候,中间参数middle就是指向右边数组的第一个,所以这里是middle+1
mergeSort(a, left, middle+1, right);
}
4:其实也可以叫我不管我影分身两个人,将数组拆成两半,你俩去将这半个数组排好序,我在这里等你们返回结果再整体排序,最后他俩也这么想的排序法。