基本情報技術者の擬似言語の学習のため実際にプログラム化してみました。
仕様はそのままに一部アルゴリズム強化のため自分で自分で条件式等を考えているため実際の擬似言語プログラムとは差異があります。
基準値は(始まりの要素番号+終わりの要素番号)/2で決めております。別パターンも近いうち投稿したいと思います。
qiita.java
import java.util.*;
public class QuickSort {
public static void main(String[] args) {
// データ配列:[80, 60, 40, 70, 30, 10, 50, 20]
// int[] data_array = { 80, 60, 40, 70, 30, 10, 50, 20 };
// int[] data_array = { 80, 60, 40, 70, 30, 10, 50, 70 };
int[] data_array = { 70, 60, 40, 70, 30, 70, 50, 70 };
// int[] data_array = { 80, 70, 60, 50, 40, 30, 20, 10 };
int start = 0; // 始まりの添字
int end = data_array.length - 1; // 終わりの添字
quickSort(start, end, data_array); // 参照呼び出し
System.out.println("クイックソート並び替え結果");
printDataArray(data_array);
}
// 出力結果
public static void printDataArray(int[] data_array) {
System.out.println(Arrays.toString(data_array));
}
public static void quickSort(int start, int end, int[] data_array) {
int left = start;
int right = end;
int mid = (start + end) / 2; // 並べ替え範囲の真ん中の添字
int shaft = data_array[mid]; // 軸
int tmp = 0;
// クイックソート
while (left < right) {
// 左側で軸より大きい要素(軸以上)を捜索
while (data_array[left] < shaft) {
left++;
}
// 右側で軸より小さい要素を捜索
while (data_array[right] > shaft) {
right--;
}
/*
* data_arrayに同じ値の要素が含まれているかつ軸と比較が起きた時、
* 比較対象を軸の右側へ
*/
if (left != right && data_array[left] == data_array[right]) {
right--;
}
// 入れ替え left = rightである場合は要素はそのまま次の探索へ
if (left < right) {
tmp = data_array[left];
data_array[left] = data_array[right];
data_array[right] = tmp;
// left++; // これかも
// right--;
}
}
// 途中結果 left = rightの時ループ抜ける
System.out.println("途中結果");
System.out.println("左 :" + left + "右 :" + right);
System.out.println("軸" + shaft);
System.out.println(Arrays.toString(data_array));
// データ配列:[80, 60, 40, 70, 30, 10, 50, 20]
// 軸よりも左側を探索
if (start < left - 1) {
System.out.println("----軸より小さい配列要素組み-----");
quickSort(start, left - 1, data_array);
}
// 軸よりも右側を探索
if (right + 1 < end) {
System.out.println("-----軸より小さい配列要素組み-----");
quickSort(right + 1, end, data_array);
}
}
}