Advertisement
xotohop

14var_3task

Dec 12th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int middle_digit(int n)
  5. {
  6.     n = n / 10 % 10;
  7.     return n;
  8. }
  9.  
  10. void ShellSort(int *array, int size)
  11. {
  12.     int step, i, j, tmp, k;
  13.     int ind_array[size], tmp_i;
  14.    
  15.     for (i = 0; i < size; i++)
  16.         ind_array[i] = i;
  17.  
  18.     for (step = size / 2; step > 0; step /= 2)          // выбор шага
  19.         for (i = step; i < size; i++)                   // перечисление элементов, которые сортируются на определённом шаге
  20.             for (j = i - step; j >= 0 && middle_digit(array[j]) < middle_digit(array[j + step]); j -= step) // Перестановка элементов внутри подсписка, пока i-тый не будет отсортирован
  21.             {
  22.                 tmp = array[j];
  23.                 array[j] = array[j + step];
  24.                 array[j + step] = tmp;
  25.  
  26.                 tmp_i = ind_array[j];
  27.                 ind_array[j] = ind_array[j + step];
  28.                 ind_array[j + step] = tmp_i;
  29.             }
  30.     for (i = 0; i < size - 1; i++)
  31.     {
  32.         if (middle_digit(array[i]) == middle_digit(array[i + 1]) && ind_array[i] < ind_array[i + 1])
  33.             {
  34.                 tmp = array[i];
  35.                 array[i] = array[i + 1];
  36.                 array[i + 1] = tmp;
  37.             }
  38.     }
  39. }
  40.  
  41. int ip_search(int *a, int n, int search_number)
  42. {
  43.     int ind_size, i, j, kp_size;
  44.  
  45.     if (n > 8)
  46.         kp_size = 8;
  47.     else
  48.         kp_size = 2;
  49.    
  50.     int kindex[n/kp_size], pindex[n/kp_size];
  51.  
  52.     for (i = 0, j = 0; i < n; i += 8, j++)
  53.     {
  54.         kindex[j] = a[i];              // переносим каждый 8-й ключ в индексную таблицу
  55.         pindex[j] = i;                 // запоминаем текущий индекс
  56.     }
  57.    
  58.     ind_size = j;                      // запоминаем размер индексной таблицы
  59.     pindex[j] = i;                     // последний индекс равен n
  60.  
  61.     for (j = 0; j < ind_size; j++)
  62.     {
  63.         if (middle_digit(search_number) > middle_digit(kindex[j])) // если находим ключ больше введенного,
  64.             break;                     // то выходим из цикла - мы нашли нужную область основной таблицы
  65.     }
  66.  
  67.     if (j == 0)  
  68.         i = 0;                         // присваиваем i начальный индекс диапазона поиска в основной таблице
  69.     else  
  70.         i = pindex[j - 1];
  71.  
  72.     for (i; i < pindex[j]; i++)        // осуществляем поиск в основной таблице
  73.     {                                  // до следующего индекса индексной таблицы
  74.         if (a[i] == search_number)     // если найдено введенное значение, выводим его
  75.         {    
  76.             printf("\na[%1d] = %2d", i, a[i]);
  77.             return 0;
  78.         }
  79.     }
  80.  
  81.     printf("\nElement doesn't exist");
  82.     return 0;
  83. }
  84.  
  85. int main()
  86. {
  87.     int n, search_number;
  88.  
  89.     printf("Enter array size = ");
  90.     scanf("%d", &n);
  91.    
  92.     printf("Enter number for search = ");
  93.     scanf("%d", &search_number);
  94.    
  95.     int a[n];
  96.  
  97.     for (int i = 0; i < n; i++)
  98.     {
  99.         printf("a[%d] = ", i);
  100.         scanf("%d", &a[i]);
  101.     }
  102.  
  103.     ShellSort(a, n);
  104.     for (int i = 0; i < n; i++)
  105.         printf("%d ", a[i]);
  106.    
  107.     ip_search(a, n, search_number);
  108.  
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement