归并排序是利用归并的思想进行排序,采用分合策略,分将问题分解成小的问题然后递归求解,而合的阶段则是将分的阶段各答案合并到一起。
    归并排序可以用下面图形来理解
    归并排序.png
    下面看代码实现

    1. /**
    2. * @author xzf
    3. * @date 2021/1/21 11:41
    4. */
    5. public class MergeSort {
    6. public static void main(String []args){
    7. int []arr = {10,8,7,11,5,4,3,2,1};
    8. sort(arr);
    9. System.out.println(Arrays.toString(arr));
    10. }
    11. public static void sort(int []arr){
    12. //在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
    13. int []temp = new int[arr.length];
    14. sort(arr,0,arr.length-1,temp);
    15. }
    16. private static void sort(int[] arr,int left,int right,int []temp){
    17. if(left<right){
    18. int mid = (left+right)/2;
    19. //左边归并排序,使得左子序列有序
    20. sort(arr,left,mid,temp);
    21. //右边归并排序,使得右子序列有序
    22. sort(arr,mid+1,right,temp);
    23. //将两个有序子数组合并操作
    24. merge(arr,left,mid,right,temp);
    25. }
    26. }
    27. private static void merge(int[] arr,int left,int mid,int right,int[] temp){
    28. //左序列指针
    29. int i = left;
    30. //右序列指针
    31. int j = mid+1;
    32. //临时数组指针
    33. int t = 0;
    34. while (i<=mid && j<=right){
    35. if(arr[i]<=arr[j]){
    36. temp[t++] = arr[i++];
    37. }else {
    38. temp[t++] = arr[j++];
    39. }
    40. }
    41. //将左边剩余元素填充进temp中
    42. while(i<=mid){
    43. temp[t++] = arr[i++];
    44. }
    45. //将右序列剩余元素填充进temp中
    46. while(j<=right){
    47. temp[t++] = arr[j++];
    48. }
    49. t = 0;
    50. //将temp中的元素全部拷贝到原数组中
    51. while(left <= right){
    52. arr[left++] = temp[t++];
    53. }
    54. }
    55. }