/* n要素を整列するクイックソートのプログラム例その2 (軸要素の選択法が異なる) */ #include #include #define N 10000 /* 配列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() /* クイックソートのテストプログラム */ { int A[N]; int n, i; FILE *file; file=fopen("sortdata", "r"); /* データの読込み */ fscanf(file, "%d", &n); if(n>N) { printf("Illegal array size n = %d for N = %d\n", n, N); exit(1); } printf("n = %d\nA = ", n); 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を出力 */ /* s1とs2の交互の幅で最初に発見した2個の値の大きい方をピボットとする */ { 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(hj) k=k-j+i-1; /* kがjを越える場合の修正 */ h=h+1; } if(A[i]>A[k]) pv=i; else if(A[i]