単純なソーティングアルゴリズムに続いて、シェルソート、クィックソート、 マージソート、ヒープソートを学修してきた。そこで、実際に、これらのソーティングアルゴリズムを実装し、入力データとしてランダムデータ、ソート済みデータを使い、 プログラム中の比較操作・交換操作に相当する行の実行回数を計測する。計測した結果からアルゴリズムの計算量についての考察を行うことを目的とする。 ただし、実装するソーティングアルゴリズムは、昇順にソートするものとする。
指定されたソーティングアルゴリズムを実装し、プログラム中の比較操作・交換操作に相当する行の実行回数を計測し、計算量について考察せよ。また、使用したソーティングのプログラ ムリストを添付せよ。
学籍番号の下1桁によって、考察するソーティングアルゴリズムを次のように指定する。
6月30日17時までに、指示された提出先へ提出せよ。
入力データ | 比較の時間計算量 | 交換の時間計算量 |
---|---|---|
昇順 | O(?) | O(?) |
降順 | O(?) | O(?) |
ランダム | O(?) | O(?) |
n2の形をしていない |
横軸の値(100, 500, 1000,,,)が等間隔である |
次の例は、バブルソートによる整列プログラム (p.186 List12.1参考)に、比較回数、交換回数を計測するために、comp++, swap++を挿入した例である。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_ELEMENTS 10000 /* 最大のデータ数 */
#define OFFSET 100 /* データ数の増分値 */
#define MAX_LINES 10 /* 関数の最大行数 */
int a[MAX_ELEMENTS] ; /* 探索するデータ領域 */
int comp, swap ; /* 比較回数、交換回数を格納する変数 */
void bubble_sort(int a[], int n);
void init_step(void);
void print_step(int);
void print_header(char *);
int sorted(int);
int main(void){
int i;
int n; /* データ数 */
srandom(time(0)); /* 乱数の種を初期設定する */
/* ランダム入力の場合 */
print_header("random");
for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) {
init_step(); /* comp, swap の初期化 */
for (i = 0; i < n; i++) {
a[i] = random() % n ; /* 配列要素に乱数値を設定する */
}
sample_sort(a, n); /* ソートを実行 */
/* ここにソートのチェックをいれる */
/* ここまでにソートのチェックをいれる */
print_step(n); /* 比較回数、交換回数の表示 */
}
/* 昇順にソートされた入力の場合 */
print_header("ascending order");
for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) {
init_step(); /* comp, swap の初期化 */
for (i = 0; i < n; i++) {
a[i] = i ; /* 配列要素に昇順のデータ値を設定する */
}
sample_sort(a, n); /* ソートを実行 */
/* ここにソートのチェックをいれる */
/* ここまでにソートのチェックをいれる */
print_step(n); /* 比較回数、交換回数の表示 */
}
/* 降順にソートされた入力の場合 */
print_header("descending order");
for (n = OFFSET; n <= MAX_ELEMENTS; n += OFFSET) {
init_step(); /* comp, swap の初期化 */
for (i = 0; i < n; i++) {
a[i] = n - i ; /* 配列要素に降順のデータ値を設定する */
}
sample_sort(a, n); /* ソートを実行 */
/* ここにソートのチェックをいれる */
/* ここまでにソートのチェックをいれる */
print_step(n); /* 比較回数、交換回数の表示 */
}
return 0;
}
void init_step(void){
swap = 0; comp = 0;
}
void print_header(char *s) {
printf("%s\n n, 比較回数, 交換回数, チェック", s);
printf("\n");
}
void print_step(int n){
printf("%4d, %8d, %8d", n, comp, swap);
if (sorted(n)) { /* 配列が整列されているかチェック */
printf(", sorted\n");
} else {
printf(", unsorted\n");
}
}
int sorted(int n) {
int i;
for (i=0; i < n-1; i++)
if (a[i] > a[i+1]) return 0;
return 1;
}
/* 以下のソートはサンプルなので自分の担当ソートに変更する */
void sample_sort(int a[], int n){
int i, j, t;
for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
comp++;
if (a[j-1] > a[j]) {
swap++;
t = a[j]; a[j] = a[j-1]; a[j-1] = t;
}
}
}
}
n, 比較回数, 交換回数, チェック
100, 4950, 2411, sorted
200, 19900, 9440, sorted
300, 44850, 21879, sorted
400, 79800, 38021, sorted
500, 124750, 64465, sorted
600, 179700, 91450, sorted
...