歸並排序 - 對一個數組進行排序


 

第一步:做數組的拆分

    //歸並排序
    public static void sort(int[] arr){
        int[] tmp = new int[arr.length];
        int left = 0 ;
        int right = arr.length-1 ;
        sortMerge(arr , left , right , tmp);

    }

    public static void sortMerge(int[] arr , int left , int right , int[] tmp){
        if(left < right){
            int mid = (left +  right) / 2 ;
            sortMerge(arr , left , mid , tmp);
            sortMerge(arr , mid+1 , right , tmp);
            merge(arr , left , mid , right , tmp);
        }

    }

第二步:排序

這一步需要兩個指針:第一個指針是前面數組的初始指針 , 第二個指針是另外一個數組的初始指針

int i = left ; //左指針
int j = mid+1 ; //右指針

做排序:

    public static void merge(int[] arr , int left , int mid , int right , int[] tmp){
        int i = left ; //左指針
        int j = mid+1 ; //右指針
        int t = 0 ;//數組臨時指針
        while (i <= mid && j <= right){
            if(arr[i] <= arr[j]){
                tmp[t++] = arr[i++];
            }else{
                tmp[t++] = arr[j++];
            }
        }
        while (i <= mid){
            tmp[t++] = arr[i++];
        }
        while (j <= right){
            tmp[t++] = arr[j++];
        }

        t = 0 ;
        while (left <= right){
            arr[left ++] = tmp[t++];
        }
    }

全部代碼:

public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {8,7,6,5,4,3,2,1} ;
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static volatile int index = 1 ;

    //歸並排序
    public static void sort(int[] arr){
        int[] tmp = new int[arr.length];
        int left = 0 ;
        int right = arr.length-1 ;
        sortMerge(arr , left , right , tmp);

    }

    public static void sortMerge(int[] arr , int left , int right , int[] tmp){
        if(left < right){
            int mid = (left +  right) / 2 ;
            sortMerge(arr , left , mid , tmp);
            sortMerge(arr , mid+1 , right , tmp);
            merge(arr , left , mid , right , tmp);
        }

    }

    public static void merge(int[] arr , int left , int mid , int right , int[] tmp){
        int i = left ; //左指針
        int j = mid+1 ; //右指針
        int t = 0 ;//數組臨時指針
        while (i <= mid && j <= right){
            if(arr[i] <= arr[j]){
                tmp[t++] = arr[i++];
            }else{
                tmp[t++] = arr[j++];
            }
        }
        while (i <= mid){
            tmp[t++] = arr[i++];
        }
        while (j <= right){
            tmp[t++] = arr[j++];
        }

        t = 0 ;
        while (left <= right){
            arr[left ++] = tmp[t++];
        }
    }

}
全部代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM