Copyright (C) IOI日本委員会 1995. All rights reserved.


問題2.

 ランダムに生成した N 個の整数データを昇順にソートするための アルゴリズムとして、挿入ソート法と選択ソート法が知られている。 下記の3つの異なる言語で書かれたプログラムは、その2つのアルゴリズム の実行時間の違いを求める。いずれか一つの言語について、空欄に適当な 条件式(論理式)を入れよ。
 CおよびPascalでは、論理式 α && β や α and β の計算はショ−ト サ−キット(αの計算が先に行われ、αが偽であることが分かった場合は βの計算は行わない方式)とする。 [2点]


QuickBASICプログラム(2)

DECLARE SUB insertionSort (table() AS INTEGER)
DECLARE SUB selectionSort (table() AS INTEGER)
CONST N = 10000, Range = 32767
OPTION BASE 1
DIM table1(N) AS INTEGER, table2(N) AS INTEGER

   CLS
   RANDOMIZE TIMER MOD Range  '乱数ルーチンの初期化
   FOR i = 1 TO N
      table1(i) = INT(RND * Range): table2(i) = table1(i)
   NEXT i

   startTime = TIMER
   CALL insertionSort(table1())
   usedTime = TIMER - startTime
   PRINT "挿入ソート法の実行時間は"; usedTime; "秒でした。"

   startTime = TIMER
   CALL selectionSort(table2())
   usedTime = TIMER - startTime
   PRINT "選択ソート法の実行時間は"; usedTime; "秒でした。"
END

SUB insertionSort (table() AS INTEGER)  '挿入ソート法
   FOR i = 2 TO N
      'table[1]〜table[i-1]がソート済みのとき、table[i]をこれらの中の適当な
      '位置に挿入し、table[1]〜table[i]がソート済みとなるようにする
      
      temp = table(i)
      FOR j = i-1 TO 1 STEP -1
             -----------------
         IF |     (a)         | THEN EXIT FOR
             -----------------
         table(j + 1) = table(j)
      NEXT j
      table(j + 1) = temp
   NEXT i
END SUB

SUB selectionSort (table() AS INTEGER)  '選択ソート法
   FOR i = 1 TO N - 1
      '全データの中の小さい方からのi-1個の要素がすでに求められてソート
      'されてtable[1]〜table[i-1]に入っているとき、table[i]〜table[N]の
      '中の最小値とtable[i]とを入れ替え、その結果、table[1]〜table[i]が
      '小さい方からi個の要素をソートしたものとなるようにする
      
      min = i
      FOR j = i + 1 TO N
             -----------------------
         IF |       (b)             | THEN min = j
             -----------------------
      NEXT j
      SWAP table(i), table(min)
   NEXT i
END SUB


Cプログラム(2)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define N 10000  

void insertion_sort(int []);
void selection_sort(int []);

void main()
{
   int i,j;  clock_t start_time,used_time;
   static int table1[N],table2[N];
           
   srand((unsigned int)time(NULL));  /* 乱数ルーチンの初期化 */
   for (i=0; i<N; i++) table1[i] = table2[i] = rand();
   
   start_time = clock()/CLK_TCK;                           
   insertion_sort(table1);
   used_time = clock()/CLK_TCK-start_time;
   printf("\n挿入ソート法の実行時間は%d秒でした。\n", (int)used_time);

   start_time = clock()/CLK_TCK;
   selection_sort(table2);
   used_time = clock()/CLK_TCK-start_time;
   printf("\n選択ソート法の実行時間は%d秒でした。\n", (int)used_time);
}

void insertion_sort(int table[])  /* 挿入ソート法 */
{
   int i,j,temp;

   for (i=1; i<N; i++) {
   /* table[0]〜table[i-1]がソート済みのとき、table[i]をこれらの中の適当な */
   /* 位置に挿入し、table[0]〜table[i]がソート済みとなるようにする         */
      
      temp = table[i];
                           -------------
      for (j=i-1; j>=0 && |    (a)      |; j--) table[j+1] = table[j];
                           -------------
      table[j+1] = temp;
   }
}

void selection_sort(int table[])  /* 選択ソート法 */
{
   int i,j,min,temp;

   for (i=0; i<N-1; i++) { 
   /* 全データの中の小さい方からのi-1個の要素がすでに求められてソート  */
   /* されてtable[0]〜table[i-1]に入っているとき、table[i]〜table[N-1] */
   /* の中の最小値とtable[i]とを入れ替え、その結果、table[0]〜table[i] */
   /* が小さい方からi個の要素をソートしたものとなるようにする          */

                                        ---------------      
      for (min=i, j=i+1; j<N; j++) if (|    (b)        |) min = j;
                                        ---------------
      temp = table[i]; table[i] = table[min]; table[min] = temp;
   }
}


Pascalプログラム(2)

program problem2;
   uses Crt,Dos;
   const N=10000; Range=32767;
   type table_type = array[1..N] of integer;

   procedure insertion_sort(var table: table_type);  { 挿入ソート法 }
      var i,j,temp: integer;
   begin
      for i:=2 to N do begin
         {table[1]〜table[i-1]がソート済みのとき、table[i]をこれらの中の適当
          な位置に挿入し、table[1]〜table[i]がソート済みとなるようにする}

         temp := table[i]; j := i-1;
                            --------------
         while (j>=1) and (|      (a)     |) do begin
                            --------------
            table[j+1] := table[j]; dec(j);
         end;
         table[j+1] := temp;
      end;
   end;

   procedure selection_sort(var table: table_type);  { 選択ソート法 }
      var i,j,min,temp: integer;
   begin
      for i:=1 to N-1 do begin 
         {全データの中の小さい方からのi-1個の要素がすでに求められてソート
          されてtable[1]〜table[i-1]に入っているとき、table[i]〜table[N]の
          中の最小値とtable[i]とを入れ替え、その結果、table[1]〜table[i]が
          小さい方からi個の要素をソートしたものとなるようにする }

         min := i;
         for j:=i+1 to N do
                -------------
            if |     (b)     | then min := j;
                -------------
         temp := table[i]; table[i] := table[min]; table[min] := temp;
      end;
   end;


   var i: integer;  hour,minute,second,sec100: word;
       start_time,used_time: real;
       table1,table2: table_type;

begin
   clrscr;
   randomize;  {乱数ルーチンの初期化}
   for i:=1 to N do begin
      table1[i] := Random(Range); table2[i] := table1[i];
   end;

   getTime(hour,minute,second,sec100);
   start_time := minute*60+second+sec100/100;
   insertion_sort(table1);
   getTime(hour,minute,second,sec100);
   used_time := minute*60+second+sec100/100 - start_time;
   writeln('挿入ソート法の実行時間は', used_time:0:2, '秒でした。');

   getTime(hour,minute,second,sec100);
   start_time := hour*3600+minute*60+second+sec100/100;
   selection_sort(table2);
   getTime(hour,minute,second,sec100);
   used_time := hour*3600+minute*60+second+sec100/100 - start_time;
   writeln('選択ソート法の実行時間は', used_time:0:2, '秒でした。');
end.


JOI'95へ戻る

JOIホームページへ戻る