/*   алгоритм выбора делением списка почти пополам   */
     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;
     }