ALDS1_1_A: Insertion Sort
この問題は『プログラミングコンテストのためのアルゴリズムとデータ構造(渡部有隆著,Ozy・秋葉拓哉協力)』を読んで解きました.
問題
- URL: Insertion Sort | Aizu Online Judge
- 要約: 挿入ソートを行い,挿入する度に数列を出力せよ
ソースコード
#include <stdio.h> //挿入ソート void insertionSort(int A[], const int N) { int i, j; for( i = 0; i < N; ++i ){ int tmp = A[i]; for( j = i-1; -1 < j && tmp < A[j]; --j ){ A[j+1] = A[j]; } A[j+1] = tmp; //出力 for( j = 0; j < N; ++j ){ printf("%d", A[j]); if( j != N-1 ) printf(" "); } printf("\n"); } } int main() { int i; //入力 int N; scanf("%d", &N); int A[N]; for( i = 0; i < N; ++i ) scanf("%d", &A[i]); insertionSort(A, N); return 0; }
反省点
- 問題文に書かれているアルゴリズムのうち,while文をfor文に書き直す
- 何も考えずにvをA[i]で置換してバグ
- A[i]は即座に書き換えられていることに気付き,vを分かりやすくtmpに変えて適用
- 入力のままが二回出力されている
- mainで入力後に出力するのをやめる
- 一発AC
- 等差数列の和は 項数*(初項+末項)/2
- 従って最悪時間計算量は (N-1)*(1+N-1)/2 = (N2-N)/2