「Javaデータ構造とアルゴリズム」学習ノート(5)-再帰集計ソート
各ノートには、本のAppletデモプログラムが添付されており、アルゴリズムが読めないものがあり、Appletのダウンロードで実行(htmlファイルを直接開くだけ)でき、アルゴリズムの一歩一歩を簡単に見ることができます.
メソッド呼び出し自体が,構成される.
再帰呼び出しです.通常、再帰には終了条件があります.そうしないと、プログラムは実行を停止できません.
集計ソート
集計ソートの原理(昇順ソート)は、2つの整列配列を1つの整列配列に結合し、2つの配列を比較することです.
第1項、
配列aの第1項がより大きい
配列bの第1項は、
配列bの第1項は、新しい配列にコピーされる.次に比較
配列aの第1項と
配列bの2番目の項目は、さらに小さいものを置く
新しい配列の2番目の位置で...マージが完了するまで.
再帰的なプロセスは,配列を分割し続けるプロセスであり,元の配列を分割できなくなるまで(長さが1)分割し続け,戻り,マージを開始する.
コードは次のとおりです.
集計ソートの時間的複雑さはO(N*logN)であり,表挿入ソート法よりもはるかに速いが,必要である.
メモリ容量の1倍以上.長さ1万の配列を並べ替えると、時間はほとんど計算されません(ほとんど0です).配列を10倍に拡大したので、ランダムな配列を並べ替えるのに0.094秒、逆順序の並べ替えに0.11秒かかりました.
メソッド呼び出し自体が,構成される.
再帰呼び出しです.通常、再帰には終了条件があります.そうしないと、プログラムは実行を停止できません.
集計ソート
集計ソートの原理(昇順ソート)は、2つの整列配列を1つの整列配列に結合し、2つの配列を比較することです.
第1項、
配列aの第1項がより大きい
配列bの第1項は、
配列bの第1項は、新しい配列にコピーされる.次に比較
配列aの第1項と
配列bの2番目の項目は、さらに小さいものを置く
新しい配列の2番目の位置で...マージが完了するまで.
再帰的なプロセスは,配列を分割し続けるプロセスであり,元の配列を分割できなくなるまで(長さが1)分割し続け,戻り,マージを開始する.
コードは次のとおりです.
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void mergeSort(T[] array){
T[] workspace = (T[])new Comparable[array.length];
recallMergeSort(array, workspace, 0, array.length - 1);
}
private static <T extends Comparable<? super T>> void recallMergeSort
(T[] array, T[] workspace, int lowerBound, int upperBound){
if(upperBound == lowerBound){
return;
}else{
int midIndex = (upperBound + lowerBound) / 2;
recallMergeSort(array, workspace, lowerBound, midIndex);
recallMergeSort(array, workspace, midIndex + 1, upperBound);
merge(array, workspace, lowerBound, midIndex + 1, upperBound);
}
}
private static <T extends Comparable<? super T>> void merge
(T[] array, T[] workspace, int lowerIndex, int higherIndex, int upperBound){
int i = 0;
int midIndex = higherIndex - 1;
int lowerBound = lowerIndex;
while(lowerIndex <= midIndex && higherIndex <= upperBound){
if(array[lowerIndex].compareTo(array[higherIndex]) < 0)
workspace[i++] = array[lowerIndex++];
else
workspace[i++] = array[higherIndex++];
}
while(lowerIndex <= midIndex)
workspace[i++] = array[lowerIndex++];
while(higherIndex <= upperBound)
workspace[i++] = array[higherIndex++];
for(i=lowerBound; i<=upperBound; i++)
array[i] = workspace[i - lowerBound];
}
集計ソートの時間的複雑さはO(N*logN)であり,表挿入ソート法よりもはるかに速いが,必要である.
メモリ容量の1倍以上.長さ1万の配列を並べ替えると、時間はほとんど計算されません(ほとんど0です).配列を10倍に拡大したので、ランダムな配列を並べ替えるのに0.094秒、逆順序の並べ替えに0.11秒かかりました.