归并排序

 1)归并排序思想

  1)将数组分成两半

  2)对左边排序

  3)对右边排序

  4)两边都排好顺了 对左右两边进行merge

代码步骤1)两个半截数组已经排好序的情况下,把他们合并到一起

第一次比较 1比3小 把1放到下面,i++

第二次比较 4比3大 把3放到下面,j++

        int mid=arr.length/2;
        int temp[] = new int[arr.length];
        int i=0;
        int j=mid+1;
        int k=0;
        while (i<=mid&&j<arr.length){
            if (arr[i]<arr[j]){
                temp[k++]=arr[i++];
            }else{
                temp[k++]=arr[j++];
            }
        }

最后两个半截数组如果有剩下的,直接copy到下面

        while (i<=mid){
            temp[k++]=arr[i++];
        }
        while (j<arr.length){
            temp[k++] =arr[j++];
        }

代码步骤2)因为我们merge的时候 可能merge的是数组的一部分,下面把上面的方法改进

leftPtr左指针指的位置

rightPtr右指针指的位置

leftPtr右边界

    static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){
        int mid=rightPtr-1;
        int temp[] = new int[rightBound-leftPtr+1];
        int i=leftPtr;
        int j=rightPtr;
        int k=0;
        while (i<=mid&&j<=rightBound){
            if (arr[i]<arr[j]){
                temp[k++]=arr[i++];
            }else{
                temp[k++]=arr[j++];
            }
        }
        while (i<=mid){
            temp[k++]=arr[i++];
        }
        while (j<=rightBound){
            temp[k++] =arr[j++];
        }
        print(temp);
    }

 代码步骤3)使用递归完成归并排序

package com.example.sort;

public class MergeSort {

    public static void main(String[] args) {
        int[] arr={1,4,100,7,10,2,3,5,8,9};
        sort(arr,0,arr.length-1);
        print(arr);
    }

    static  void sort(int[] arr,int left,int right){
        if (left>=right){
            return;
        }
        //分成两半
        int mid = (left+right)/2;
        //左边排序
        sort(arr,left,mid);
        //右边排序
        sort(arr,mid+1,right);
     //左右两边都排好顺序之后进行merge merge(arr,left,mid
+1,right); } /*** * 两个半截数组已经排好序的情况下 * 把他们合并到一起 * 指定整个数组不够灵活,增加参数 * @param arr */ static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){ int mid=rightPtr-1; int temp[] = new int[rightBound-leftPtr+1]; int i=leftPtr; int j=rightPtr; int k=0; while (i<=mid&&j<=rightBound){ if (arr[i]<arr[j]){ temp[k++]=arr[i++]; }else{ temp[k++]=arr[j++]; } } while (i<=mid){ temp[k++]=arr[i++]; } while (j<=rightBound){ temp[k++] =arr[j++]; }   //把temp数组复制到arr数组中; for (int m=0;m<temp.length;m++){ arr[leftPtr+m]=temp[m]; } } private static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
原文地址:https://www.cnblogs.com/ssskkk/p/12590163.html