【javaデータ構造とアルゴリズム学習】集計ソート


今日は集計ソートを記録します.
集計ソートの主な考え方:
配列を半分に分けて、半分ずつ順番に並べて、半分ずつの配列の先頭にポインタを設定して比較します.小さいものは補助配列に置いて、そのポインタは下に移動して、その中の片側の配列が先頭に着くまで、残りの要素を補助配列にコピーして、配列を返すのが秩序配列です.
master式O(T)=aO(T/b)+O(N^d)から,a=2,b=2,d=1であることが分かった.a/b=dなので,集計ソートの時間的複雑さはO(N*logn)である.
    
public class MergeSort {
	
	public static void mergeSort(int[] arr) {
		//      ,      2,      ,    
		if (arr == null || arr.length < 2) {
			return;
		}
		sortProcess(arr, 0, arr.length - 1);
		
	}
	public static void sortProcess(int[] arr, int L, int R) {
		//      ,          ,    ,  
		if (L == R) {
			return;
		}
		int mid = L + ((R-L) >> 1);//   (L + R) / 2,      
		//     
		sortProcess(arr, L, mid);
		//     
		sortProcess(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;
		//p1             
		int p1 = L;
		//p2             
		int p2 = mid + 1;
		//           
		while (p1 <= mid && p2 <= R){
			//     ,      
			if(arr[p1] < arr[p2]) {
				help[i++] = arr[p1++];
			}else {
				help[i++] = arr[p2++];
			}
		}
		//          ,                    
		while(p1 <= mid) {
			help[i++] = arr[p1++];
		}
		while(p2 <= R) {			
			help[i++] = arr[p2++];
		}
		//               
		for(int j = 0;j