JAVA实现归并排序
北京时间2022年03月13日,晚19:18分。天气晴朗,多云,温度28。现在来实现JAVA归并排序,归并的核心思想是自顶向上排序,先划分到不可划分的时候排序(两个元素时),然后逐渐退回上一层递归...因此,思路为:
(一)、先递归把元素分解为不可再分解
(二)、对(一)中的两个元素排序
(三)、完成(二)后,退回上一层递归...
(四)、代码实现:
public static void main(String[] args){
int[] array = {4,5,0,1,2,-1,-99};
MergeSort(array,0,array.length-1);
// sort(array,0,array.length-1,2);
print(array,"结果");
}
public static void MergeSort(int[] array,int left,int right){
// 首先分解元素
System.out.println("left="+left+",right="+right);
if (left>=right){
return;
}
int mid =(right+left)/2;
MergeSort(array,left,mid);
MergeSort(array,mid+1,right);
// 分解到不可分解的时候就退回到这里,既left和right加起来就只有两个元素
sort(array,left,right,mid);
}
/**
*
* @param start
* @param end array.length
* mid 指定mid前的数是有序的,mid后的也是有序的
*/
public static void sort(int[] array,int start,int end,int mid){
// 已array={4,5,0,1,2}为例,mid=4+0/2=2
int size = array.length;
int left = start;
int right = mid+1;
int[] newArray = new int[end-start+1];
// 所以while循环遍历
int k=0;
System.out.println("start="+start+",end="+end);
while (left<=mid && right<=end){
if (array[left]>array[right]){
System.out.println("k="+k+",left="+left+",right="+right);
newArray[k++] = array[right++];
}else if (array[left]<array[right]){
newArray[k++] = array[left++];
}
}
// 把剩下的元素填充到newArray,如{4,5,0,1,2},mid=2,newArray只填充了012
while (left<=mid){
newArray[k++]=array[left++];
}
while (right<=end){
newArray[k++]=array[right++];
}
// 最后用newArray元素覆盖array
for (int i=0;i<newArray.length;i++){
// 因为这是递归进来的,所以下标是从start+i开始
array[start+i] = newArray[i];
}
}
public static void print(int[] array,String str){
System.out.println(str);
for (int i:array){
System.out.print(i+" ");
}
System.out.println();
}