アルゴリズム


■内容

Top

■アルゴリズム

Top

■線形探索

Top
■例題
  1. コマンドラインから入れた整数が、アプリケーション中のint型配列の要素(10,20,30,40,50の5つ)と一致しているか否かを検査し、一致する場合はそのときの添字をプリントするアプリケーション"SequentialSearch.java"を作成してください。ただし、配列の要素は昇順に並んでいるとは限りません。
    1. public class SequentialSearch {
    2. public static void main(String[] args) {
    3. int n = Integer.parseInt(args[0]);
    4. int[] a = {50, 30, 40, 10, 20};
    5. int i = search(a, n);
    6. if (i >= 0) {
    7. System.out.println(n + " was found.(index = " + i + ")");
    8. } else {
    9. System.out.println(n + " was not found.");
    10. }
    11. }
    12. static int search(int[] a, int n) {
    13. for (int i = 0; i < a.length; i++) {
    14. if (a[i] == n) {
    15. return i;
    16. }
    17. }
    18. return -1;
    19. }
    20. }

    □ 実行結果

    $java SequentialSearch 50
    50 was found.(index = 0)
    
    $java SequentialSearch 51
    51 was not found.
    
Top
■実習
Top

■2分探索

Top
■例題
  1. コマンドラインから入れた整数が、アプリケーション中のint型配列の要素(10,20,30,40,50の5つ)と一致しているか否かを検査し、一致する場合はそのときの添字をプリントするアプリケーション"BinarySearch.java"を作成してください。ただし、配列の要素は昇順に並んでいます。
    1. public class BinarySearch {
    2. public static void main(String[] args) {
    3. int n = Integer.parseInt(args[0]);
    4. int[] a = {10, 20, 30, 40, 50};
    5. int i = search(a, n);
    6. if (i >= 0) {
    7. System.out.println(n + " was found.(index = " + i + ")");
    8. } else {
    9. System.out.println(n + " was not found.");
    10. }
    11. }
    12. static int search(int[] a, int n) {
    13. int l = 0;
    14. int h = a.length - 1;
    15. int m;
    16. while (l <= h) {
    17. m = (l + h) / 2;
    18. if (a[m] < n) {
    19. l = m + 1;
    20. } else if (a[m] > n) {
    21. h = m - 1;
    22. } else {
    23. return m;
    24. }
    25. }
    26. return -1;
    27. }
    28. }

    □ 実行結果

    $java BinarySearch 50
    50 was found.(index = 4)
    
    $java BinarySearch 51
    51 was not found.
    
Top
■実習
Top

■コントロール・ブレーク

Top
■例題
  1. 配列の各要素の降順の順位をプリントするアプリケーション"Rank01.java"を作成してください。
    1. public class Rank01 {
    2. public static void main(String[] args) {
    3. int[] a = {5, 3, 6, 5, 8, 6, 9, 1, 3, 3};
    4. int[] rank = new int[a.length];
    5. for (int i = 0; i < a.length; i++) {
    6. rank[i] = 1;
    7. for (int j = 0; j < a.length; j++) {
    8. if (a[j] > a[i]) {
    9. rank[i]++;
    10. }
    11. }
    12. }
    13. for (int i = 0; i < a.length; i++) {
    14. System.out.println(a[i] + " - " + rank[i]);
    15. }
    16. }
    17. }

    □ 実行結果

    $java Rank01
    5 - 5
    3 - 7
    6 - 3
    5 - 5
    8 - 2
    6 - 3
    9 - 1
    1 - 10
    3 - 7
    3 - 7
    
  2. 昇順に並んでいるint配列aがあります。配列aの中の同じ要素の数をカウントするアプリケーション"Count01.java"を作成してください。
    1. public class Count01 {
    2. public static void main(String[] args) {
    3. int[] a = {2, 2, 3, 5, 5, 5, 7, 8, 8};
    4. int prevValue = a[0];
    5. int count = 0;
    6. for (int i = 0; i < a.length; i++) {
    7. if (prevValue == a[i]) {
    8. count++;
    9. } else {
    10. System.out.println(prevValue + " : " + count);
    11. count = 1;
    12. prevValue = a[i];
    13. }
    14. }
    15. System.out.println(prevValue + " : " + count);
    16. }
    17. }

    □ 実行結果

    $java Count01
    2 : 2
    3 : 1
    5 : 3
    7 : 1
    8 : 2
    
Top
■実習
Top

■併合

Top
■例題
  1. 昇順に並んでいる2つのint配列a,bがあります。配列aとbをまとめて、新しい配列cをつくるアプリケーション"Matching01.java"を作成してください。このとき、つぎのような条件を前提とします。
    1. public class Matching01 {
    2. public static void main(String[] args) {
    3. int[] a = {10, 20, 30, 40, 50, Integer.MAX_VALUE};
    4. int[] b = {15, 20, 30, 35, 50, 60, Integer.MAX_VALUE};
    5. System.out.println(ArrayUtil.toString(match(a, b)));
    6. }
    7. static int[] match(int[] a, int[] b) {
    8. int[] c = new int[a.length + b.length];
    9. int i = 0, j = 0, k = 0;
    10. while (a[i] < Integer.MAX_VALUE || b[j] < Integer.MAX_VALUE) {
    11. if (a[i] < b[j]) {
    12. c[k++] = a[i++];
    13. } else if (a[i] == b[j]) {
    14. c[k++] = a[i++];
    15. j++;
    16. } else {
    17. c[k++] = b[j++];
    18. }
    19. }
    20. c[k] = Integer.MAX_VALUE;
    21. return c;
    22. }
    23. }

    □ 実行結果

    $java Matching01
    [10, 15, 20, 30, 35, 40, 50, 60, 2147483647, 0, 0, 0, 0]
    
Top
■実習
Top

■整列

Top
■例題
  1. コマンドラインから入れた整数を昇順に並べ替えるアプリケーション"Sort01.java"を作成してください。(解答例は選択ソートです)
    1. public class Sort01 {
    2. public static void main(String[] args) {
    3. int n = args.length;
    4. int[] a = new int[n];
    5. for (int i = 0; i < n; i++) {
    6. a[i] = Integer.parseInt(args[i]);
    7. }
    8. for (int i = 0; i < n - 1; i++) {
    9. for (int j = i + 1; j < n; j++) {
    10. if (a[i] > a[j]) {
    11. int t = a[i];
    12. a[i] = a[j];
    13. a[j] = t;
    14. }
    15. }
    16. }
    17. System.out.println(ArrayUtil.toString(a));
    18. }
    19. }

    □ 実行結果

    $java Sort01 6 3 5 1
    [1, 3, 5, 6]
    
  2. (オプション)
    上記機能をsort(int[])メソッドとして、
    "ArrayUtil.java"クラスに入れてください。これを確認するアプリケーション"Sort02.java"を作成してください。
  3. 
    
    
    
    
Top
■実習
Top

inserted by FC2 system