基本情報技術者の擬似言語の学習のため実際にプログラム化してみました。
仕様はそのままに一部アルゴリズム強化のため自分で自分で条件式等を考えているため実際の擬似言語プログラムとは差異があります。
qiita.java
import java.util.*;
public class SelectArrayElement {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("配列の要素数を入力してください");
int elements = Integer.parseInt(sc.next());
int[] data_array = new int[elements];
/*
* テストデータ
* 入力値 = 3 2回目 7
* [3,5,6,4,7,2,1] 1回目 => 3 ok 2回目: => 7 ok
* [1,3,2,4,2,2,2] 1回目 => 2 ok 2回目: => 4 ok
* [7,6,5,4,3,2,1] 1回目 => 3 ok 2回目: => 7 ok
* [1,2,3,4,5,6,7] 1回目 => 3 ok 2回目: => 7 ok
* [7,7,7,7,7,7,7] 1回目 => 7 ok 2回目: => 7 ok
* [1,2,5,10,5,6,7] 1回目 => 5 ok 2回目: => 10 ok
* [8,2,5,10,11,6,7] 1回目 => 6 ok 2回目: => 11 ok
* [1,2,5,10,11,6,7] 1回目 => 5 ok 2回目: => 11 ok
* [12,13,15,5,1,9,20] 1回目 => 9 ok 2回目: => 20 ok
* [9,9,9,9,1,6,8] 1回目 => 8 ok 2回目: => 9 ok
*/
System.out.println("配列の各要素を" + elements + "回入力してください");
for (int i = 0; i < elements; i++) {
data_array[i] = Integer.parseInt(sc.next());
}
System.out.println("何番目に小さい要素を取得しますか?(1~" + elements + "までの範囲)");
int k = Integer.parseInt(sc.next()) - 1; // 何番目の要素を取得するか
int return_value = selectElement(k, data_array);
// 出力
System.out.println("結果表示");
System.out.println((k + 1) + "番目に小さい要素は" + return_value + "です。");
System.out.println(Arrays.toString(data_array));
}
// クイックソートを応用し配列の要素を昇順に並べる。
public static int selectElement(int k, int[] data_array) {
int top = 0;
int last = data_array.length - 1;
/*
* k番目に小さい要素を取得する。
*/
while (top < last) {
// 変数
int i = top;
int j = last;
int pivot = data_array[k];
while (true) {
// 基準値よりも大きい値を左側へ振り分ける
while (data_array[i] < pivot) {
i++;
}
// 基準値よりも大きい値を左側へ振り分ける
while (data_array[j] > pivot) {
j--;
}
// ループ条件trueのループを抜ける
if (i >= j) {
break;
}
// 並び替え
swap(i, j, data_array);
i++;
j--;
}
/*
* topとlastを書き換えて再探索
* k = i, k = j になったら探索終了
*/
// kが基準以上以下より小さい場合 last更新
if (i > k) {
last = i - 1;
}
// kが基準以上以下より大きい場合 top更新
if (j < k) {
top = j + 1;
}
// 終了
if (i == k && j == k) {
top = k;
last = k;
}
}
return data_array[k];
}
public static void swap(int i, int j, int[] data_array) {
int tmp = 0;
tmp = data_array[i];
data_array[i] = data_array[j];
data_array[j] = tmp;
}
}