0
0

More than 1 year has passed since last update.

基本情報の擬似言語とクイックソートでk番目に小さい値を探してみた!

Posted at

基本情報技術者の擬似言語の学習のため実際にプログラム化してみました。
仕様はそのままに一部アルゴリズム強化のため自分で自分で条件式等を考えているため実際の擬似言語プログラムとは差異があります。

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;
  }

}












0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0