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] + " ");
}
}
}
分治法實現歸併排序(JAVA實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.