归并排序
归并排序分为两步,分别是:合并、分治。
接下来先看合并的原理:
首先保证前一半跟后一半都有序。
①先创建两个新数组。
②将前一半的数组元素赋值到Left数组中,
将后一半的数组元素赋值到Right数组中。
③设置下标i,j,k,从小到大填入arr数组。
分治其实就是递归调用。
接下来上代码:
import java.util.Arrays;
//归并排序主要分两个步骤:合并、分治
public class __GuiBingPaiXu {
public static void main(String[] args) {
int[] arr = new int[] {5,7,9,10,3,4,8,12};
Sort(arr);
System.out.println(Arrays.toString(arr));
}
//封装一下
static void Sort(int[] arr) {
mergesort(arr, 0, arr.length-1);
}
//分治
static void mergesort(int[] arr, int L, int R) {
if(L==R) {
return;
}else {
int M = (L+R)/2;
mergesort(arr, L, M);
mergesort(arr, M+1, R);
merge(arr, L, M+1, R);
}
}
//合并
static void merge(int[] arr, int L, int M, int R) {
//定义数组大小
int LeftSize = M-L;
int RightSize = R-M+1;
//创建两个新数组
int[] Left = new int[LeftSize];
int[] Right = new int[RightSize];
//分别将相应元素赋值到新数组中
for (int i = L; i < M; i++) {
Left[i-L] = arr[i];
}
for (int i = M; i <= R; i++) {
Right[i-M] = arr[i];
}
int i = 0;
int j = 0;
int k = L; //注意:这里从L开始
//将两个数组中的数据从小到大存到arr中
while(i<LeftSize&&j<RightSize) {
if(Left[i]<Right[j]) {
arr[k++] = Left[i++];
}else {
arr[k++] = Right[j++];
}
}
while(i<LeftSize) {
arr[k++] = Left[i++];
}
while(j<RightSize) {
arr[k++] = Right[j++];
}
}
}