/* алгоритм выбора делением списка почти пополам */ int search (int *b, int n, int i) { int findi(int *, int, int); int t, m, j, p, s, *w; if (n<21) return findi(b, n, i); /* шаг 1 */ p="(int)(n/7);" w="calloc(p+1,sizeof(int));" /* шаги 2 и 3 */ for (t="0;" t < p; t++) w[t]="findi(b+7*t," 7, 3); if (n%7!="0)" { w[p]="findi(b+7*p,n%7,(n%7)/2);" p++; } m="search(w," p, p/2); free (w); for (j="0," t="0;" t < n; t++) /* шаг 4 */ if (b[t]>=m) j++; if (j>i) { for (p=0, t=0; p < n; t++) if (b[t]>=m) { b[p]=b[t]; p++; } m=search(b, j, i); /* поиск в B" */ } if (j < i) { for (p=0, t=0; t < n; t++) if (b[t] < m) b[p++]=b[t]; m=search(b, n-j, i-j); /* поиск в B" */ } return m; }