歸併排序思路:
1、將n個元素分成各含n/2個元素的子序列
2、然後對兩個子序列進行遞歸的排序
3、最後將兩個已排序的子序列進行合併得到最終的排序結果
public static int[] arr;
public static void main(String[] args) {
int[] A = {5,8,9,11,2,5,4,3};
arr = new int[A.length];
mergeSort(A, 0, A.length-1);
for (int i = 0; i < A.length; i++) {
System.out.print(A[i]+" ");
}
}
//歸併排序
public static void mergeSort(int[] A,int p,int r)
{
if(p<r)
{
int mid = p+(r-p)/2;
mergeSort(A, p, mid); //左側歸併排序
mergeSort(A, mid+1, r); //右側歸併排序
merger(A,p,mid,r); //兩側合併
}
}
//合併
public static void merger(int[] A,int p, int mid, int r)
{
//輔助空間arr
for(int i = 0;i<A.length;i++)
{
arr[i] = A[i];
}
int left = p; //左側隊伍的頭部指針
int right = mid+1; //右側隊伍的頭部指針
int current = p; //原數組A的頭指針
//左側隊伍和右側隊伍都沒走到底的情況
while(left <=mid && right<=r)
{
if(arr[left]<=arr[right])
{
A[current] = arr[left];
current++;
left++;
}else
{
A[current] = arr[right];
current++;
right++;
}
}
//說明左側隊伍還沒有走完
while(left <=mid)
{
A[current] = arr[left];
current++;
left++;
}
}