/* p番目の要素を選択する最悪時間O(n)のアルゴリズム、 SELECTのプログラム例 */ #include #define N 500 /* 配列Aの最大サイズ */ /* 関数の宣言 */ int select(int i, int j, int p, int *A); void quicksort(int i, int j, int *A); int partition(int i, int j, int a, int *A); int pivot(int i, int j, int *A); void swap(int i, int j, int *A); main() /* p番目の要素の選択のテストプログラム -- SELECT -- */ { int A[N], n, i, p, ap; FILE *file; file=fopen("selectdata", "r"); /* データファイルの読込 */ fscanf(file, "%d", &n); fscanf(file, "%d", &p); if(n>N) /* 配列サイズのチェック */ { printf("Illegal array size n = %d for N = %d\n", n, N); exit(1); } for(i=0; i=aを満たす */ { int l, r, k; l=i; r=j; /* lは左から、rは右から */ while(A[l]=a) r=r-1; while(l<=r) /* A[l]>=aとA[r]=a) r=r-1; /* つぎのlとrを計算 */ } k=l; return(k); } int pivot(int i, int j, int *A) /* A[i],...,A[j]から軸要素A[pv]を選びpvを出力 */ /* A[pv]はA[i]と最初に異なるA[k]の大きい方;すべて同じならpv=-1 */ { int pv, k, h, s0, s1, s2; s0=j-i; s1=(s0+1)/2; if(s0%2==0) s2=s1; else s2=s1-1; h=1; k=i+s1; /* s1とs2の交互のステップ幅でkを増加 */ while(A[i]==A[k] && hj) k=k-j+i-1; /* kがjを越える場合の修正 */ h=h+1; } if(A[i]>A[k]) pv=i; else if(A[i]