使用递归的方式实现归并排序:
//归并排序
public static void mergeSort(int[] arr, int left, int right, int[] temp){
if(arr != null && arr.length > 0){
//递归结束条件,只剩一个元素的时候开始回溯
if(left == right){
return;
}
//中间值,用于分割数组,每次从中间值开始分,[left,mid] [mid+1,right]
int middle = (left + right) / 2;
//左边递归,左边递归完右边再递归
mergeSort(arr, left, middle, temp);
mergeSort(arr, middle+1, right,temp);
int t = 0; //临时数组的下标
int i = left; //左边数组的开始位置
int j = middle + 1; //右边数组的开始位置
//比较左右两边数组的大小,按照大小放入临时数组,直到一边的数全部放进临时数组则退出,这样临时中的数据就是有序的
//优雅
while(i<=middle && j<= right){
temp[t++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
//上面执行完之后还有一些剩余的数据没有进入临时数组,这里再把剩余的放进去
//左边剩余数据的处理
while(i<=middle){
temp[t] = arr[i];
t++;
i++;
}
//右边剩余数据的处理
while(j<=right){
temp[t] = arr[j];
t++;
j++;
}
//这一步执行完之后临时数组中的数据就是有序的
//将临时数组中的数据放入数组中
t = 0;
while(left<=right){
arr[left] = temp[t];
left++;
t++;
}
// for (int k = left; k <= right; k++) {
// arr[k] = temp[t];
// t++;
// }
}
}