問題
- 下のプログラム中、ソート部分を、挿入ソートで実現しなさい
- 挿入の別のとらえかた
- 言葉にすると
- 挿入対象の値と、j番目を比較する。j番目の方が大きいから、j+1番目にずらす。(後ろに動かしてしまう)
実行例
解答例
[プログラムテンプレート(未完)]コードをハイライトすると、簡単な文法解説が表示されます(現在、停止中)
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 int a[100]; void set_array(void); void print_array(void); void set_array (void) { //100未満の乱数 N個生成して、配列にセット int i; srand((unsigned)time(NULL)); for(i = 0; i < N; i++) a[i] = rand()%100; } void print_array() { // 配列をプリント int i; printf(" i:"); for(i=0; i < N; i++) { printf("%3d ",i); } printf("\n"); printf("a[i]:"); for(i=0; i < N; i++) { printf("%3d ",a[i]); } printf("\n"); printf("\n"); } int main(void){ int i,j; /* 必要な変数を追加のこと */ int t; /* 挿入対象の値 */ set_array(); // N個乱数を配列にセット print_array(); // ソート前プリント /* a[]を挿入ソートする */ /* 大きい値は後ろへずらすことを繰り返す。適切な空所に挿入 */ for (i = 1; i < N; i++) { t = a[i]; /* 新規追加の値。挿入対象の値 */ for (j = i - 1; j >= 0; j-- ) { /* jは前へ進む */ if (a[j] > t ) /* j番目の値が、tより大きい */ a[j+1] = a[j]; /* その値は一つ後ろのj+1番へ動かす */ else break; } a[j+1] = t; /* tがa[j]より大きくない。なら、その後ろにtを。 あるいはjが0を超えた。なら、a[0]=tだ (先頭に挿入) */ } print_array(); // ソート後プリント return 0; }
アドバイス