分治法實現歸併排序(JAVA實現)

package com.merge.sort;

public class Merge_sort_test {

    public static void Merge(int[] A,int p,int q,int r){

        int[] tmp = new int[r-p+1];//聲明一個臨時數組,長度爲要歸併數組的長度
        int i = p;   //記住左邊數組第一個元素的下標
        int j = q+1; //記住右邊數組第一個元素的下標
        int k = 0;      
        while(i <= q && j <= r){
            //左邊數組元素和右邊數組元素比較,把小的元素賦給臨時數組
            if(A[i] <= A[j]){               
                tmp[k++] = A[i++];
            }
            else{               
                tmp[k++] = A[j++];
            }
        }
        //把左邊剩餘的數組元素賦給臨時數組
        while(i <= q){          
            tmp[k++] = A[i++];
        }
        //把右邊剩餘的數組元素賦給臨時數組
        while(j <= r){          
            tmp[k++] = A[j++];
        }
        //用臨時數組元素覆蓋原數組元素
        for(int k2 = 0;k2 < tmp.length;k2++){           
            A[k2+p] = tmp[k2]; 
        }
    }
    public static void Merge_sort(int[] A,int p,int r){//p爲起始位置,r爲結束位置
        int q = (p+r)/2;//q爲二分位置
        if(p < r){
            //遞歸調用          
            Merge_sort(A,p,q);//遞歸解決前半部分
            Merge_sort(A,q + 1,r);//遞歸解決後半部分
            //歸併排序數據元素
            Merge(A,p,q,r);//最後將所有有序數組完成歸併
        }
    }

    //主函數
    public static void main(String[] args) {
        //建立原始數組,可輸入
        int[] A = {5,2,4,7,1,3,2,6};
        System.out.println("原始數據: ");
        for(int i = 0;i < A.length;i++){
            System.out.print(A[i] + " ");
        }
        System.out.println();
        Merge_sort(A,0,A.length -1);//從數組A的0位到A.length-1位排序
        System.out.println("輸出結果: ");
        for(int i = 0;i < A.length;i++){
            System.out.print(A[i] + " ");
        }
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章