題目:將數組採用遞歸的歸併排序的思想按照升序排序。
思想如下:將數組進行折半劃分,大問題轉換爲小問題,先將小的問題使用merge函數排好序,然後遞歸回到上一個問題,再採用merge排好序,以此類推。
package com.inspire.chapter3;
public class MergeSort {
public static void main(String[] args) {
//歸併排序時間複雜度O(N*logN)
int[] arr={10,9,8,7,6,3,5,2,4,1};
sort(arr,0,arr.length-1);
printf(arr);
}
public static void sort(int[] arr, int L, int R) {
if(L>=R){//這一步很重要
return;
}
int mid=L+((R-L)>>1);
sort(arr,L,mid);
sort(arr,mid+1,R);
merge(arr,L,mid,R);
}
public static void merge(int[] arr, int L, int mid, int R) {
int[] help=new int[R-L+1];
int i=0;//指向help數組下標
int p=L;
int q=mid+1;
while(p<=mid&&q<=R){
help[i++]=arr[p]<arr[q] ? arr[p++]:arr[q++];
}
while(p<=mid){
help[i++]=arr[p++];
}
while(q<=R){
help[i++]=arr[q++];
}
for(int j=0;j<help.length;j++){
arr[L++]=help[j];
}
}
public static void printf(int[] arr) {
for(int i:arr){
System.out.print(i+" ");
}
}
}