【javaデータ構造とアルゴリズム学習】集計ソート
今日は集計ソートを記録します.
集計ソートの主な考え方:
配列を半分に分けて、半分ずつ順番に並べて、半分ずつの配列の先頭にポインタを設定して比較します.小さいものは補助配列に置いて、そのポインタは下に移動して、その中の片側の配列が先頭に着くまで、残りの要素を補助配列にコピーして、配列を返すのが秩序配列です.
master式O(T)=aO(T/b)+O(N^d)から,a=2,b=2,d=1であることが分かった.a/b=dなので,集計ソートの時間的複雑さはO(N*logn)である.
集計ソートの主な考え方:
配列を半分に分けて、半分ずつ順番に並べて、半分ずつの配列の先頭にポインタを設定して比較します.小さいものは補助配列に置いて、そのポインタは下に移動して、その中の片側の配列が先頭に着くまで、残りの要素を補助配列にコピーして、配列を返すのが秩序配列です.
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