JAvaソート(二)
クイックソート:
まず、表の中の1つの要素を区分要素として選択する.次に、表を区分し、区分要素より小さいすべての要素を区分要素の左側に配置し、区分要素より大きいすべての要素をその右側に拡大する.最後に、このような戦略で2つの区分のフィールドをソートする.
集計ソート:
最初は表をほぼ等しい両端に分割し、各ワード表に対して自身を再帰的に呼び出す.この再帰的な呼び出しプロセスを継続し、再帰の基礎状況に達するまで、このとき表は1つの要素しか含まれていないワード表に分かれている.
再帰呼び出し構造は、アルゴリズムが2つの再帰呼び出しから得る2つの順序付きサブセグメントを1つの順序付きテーブルに結合する.
まず、表の中の1つの要素を区分要素として選択する.次に、表を区分し、区分要素より小さいすべての要素を区分要素の左側に配置し、区分要素より大きいすべての要素をその右側に拡大する.最後に、このような戦略で2つの区分のフィールドをソートする.
public static void quickSort (Comparable[] data, int min, int max) {
int pivot;
if (min < max){
pivot = partition(data, min, max);
quickSort(data, min, pivot-1);
quickSort(data, pivot+1, max);
}
}
//
private static int partition (Comparable[] data, int min, int max){
//
Comparable partitionValue = data[min];
int left = min;
int right = max;
while (left < right ) {
//
while (data[left].compareTo(partitionValue) <= 0 && left < right)
left ++;
//
while (data[right].compareTo(partitionValue) > 0 )
right --;
if (left < right)
swap(data, left, right);
}
swap(data, min, right);
return right;
}
集計ソート:
最初は表をほぼ等しい両端に分割し、各ワード表に対して自身を再帰的に呼び出す.この再帰的な呼び出しプロセスを継続し、再帰の基礎状況に達するまで、このとき表は1つの要素しか含まれていないワード表に分かれている.
再帰呼び出し構造は、アルゴリズムが2つの再帰呼び出しから得る2つの順序付きサブセグメントを1つの順序付きテーブルに結合する.
public static void mergeSort(Comparable[] data, int min, int max) {
if(min < max) {
int mid = (min + max) / 2;
mergeSort(data, min, mid);
mergeSort(data, mid + 1, max);
merge(data, min, mid, max);
}
}
public static void merge(Comparable[] data, int first, int mid, int last) {
Comparable[] temp = new Comparable[data.length];
int first1 = first, last1 = mid; //endpoints of first subarray
int first2 = mid + 1, last2 = last; //endpoints of second subarray
int index = first1;
while(first1 <= last1 && first2 <= last2) {
if(data[first1].compareTo(data[first2]) < 0) {
temp[index] = data[first1];
first1 ++;
}
else {
temp[index] = data[first2];
first2 ++;
}
index ++;
}
//Copy remaining elements from first subarray, if any
while(first1 <= last1) {
temp[index] = data[first1];
first1 ++;
index ++;
}
//Copy remaining elements from second subarray, if any
while(first2 <= last2) {
temp[index] = data[first2];
first2 ++;
index ++;
}
//Copy merged data into original array
for (index = first; index <= last; index++)
data[index] = temp[index];
}