Advertisement
Guest User

7 задача

a guest
Apr 24th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.35 KB | None | 0 0
  1. //7_1. Быстрейшая сортировка.Дан массив целых чисел в диапазоне [0..10^9]. Размер массива кратен 10 и ограничен сверху значением 2.5 * 10^7 элементов. Все значения массива являются элементами псевдо-рандомной последовательности. Необходимо отсортировать элементы массива за минимально время и вывести каждый десятый элемент отсортированной последовательности. Минимальный набор оптимизаций, который необходимо реализовать:
  2. //1. Оптимизация ввода/вывода
  3. //2. Оптимизация выбора опорного элемента
  4. //3. Оптимизация Partition
  5. //4. Оптимизация рекурсии
  6. //5. Оптимизация концевой рекурсии
  7.  
  8.  
  9. #include <iostream>
  10. #include <vector>
  11. #include <cstdlib>
  12. #include <stdio.h>
  13. #define MAX_COUNT 25000000
  14.  
  15.  
  16. template <class T>
  17. size_t findPivotIndex(T *arr, size_t begin, size_t end) {
  18.     //Рандомный индекс опорного элемента
  19.     return begin + (rand() % (end - begin + 1));
  20. }
  21.  
  22. template <class T>
  23. T Partition(T* arr, size_t begin, size_t end) {
  24.     //Реализация стратегии выбора опорного элемента - случайный
  25.     size_t pivotIndex = findPivotIndex(arr, begin, end);
  26.     std::swap(arr[begin], arr[pivotIndex]);
  27.     T pivot = arr[begin];
  28.    
  29.     //Итераторы
  30.     size_t i = begin + 1;
  31.     size_t j = end;
  32.    
  33.     //Hoare partition
  34.     while (true) {
  35.         while (i <= end && arr[i] < pivot) {
  36.             i++;
  37.         }
  38.         while (j >= begin && arr[j] > pivot) {
  39.             j--;
  40.         }
  41.         if (i < j) {
  42.             std::swap(arr[i], arr[j]);
  43.             ++i;
  44.             --j;
  45.         } else {
  46.             std::swap(arr[begin], arr[i - 1]);
  47.             return i - 1;
  48.         }
  49.     }
  50. }
  51.  
  52. inline bool scanInt(long *number) {
  53.     //Нагугленный быстрый ввод
  54.     long resultNumber = 0;
  55.     long numberChar = getchar_unlocked();
  56.     if (numberChar == EOF) {
  57.         return false;
  58.     }
  59.     for(; numberChar > 47 && numberChar < 58 ; numberChar = getchar_unlocked()) {
  60.         resultNumber = (resultNumber << 1) + (resultNumber << 3) + numberChar - 48;
  61.     }
  62.     *number = resultNumber;
  63.     return true;
  64. }
  65.  
  66. inline void print(long number) {
  67.     //Нагугленный быстрый вывод
  68.     int i = 0;
  69.     char buffer[20];
  70.     while(number > 0) {
  71.         buffer[i++] = number % 10 + '0';
  72.         number = number / 10;
  73.     }
  74.     --i;
  75.     while(i >= 0) {
  76.         putchar_unlocked(buffer[i--]);
  77.     }
  78.     putchar_unlocked(' ');
  79. }
  80.  
  81. template <class T>
  82. void sort(T*, size_t, size_t);
  83.  
  84. int main() {
  85.     long *numbers = new long[MAX_COUNT];
  86.     int count = 0;
  87.     while (scanInt(&numbers[count])) {
  88.         count++;
  89.     }
  90.    
  91.     sort(numbers, 0, count - 1);
  92.    
  93.     for (int i = 9; i < count; i+=10) {
  94.         print(numbers[i]);
  95.     }
  96.     delete[] numbers;
  97.     return 0;
  98. }
  99.  
  100. template <class T>
  101. void selectionSort(T *array, size_t count) {
  102.     for (int i = 0; i < count - 1; ++i) {
  103.         int minIndex = i;
  104.         for (int j = i + 1; j < count; ++j) {
  105.             if (array[j] < array[minIndex]) {
  106.                 minIndex = j;
  107.             }
  108.         }
  109.         std::swap(array[i], array[minIndex]);
  110.     }
  111. }
  112.  
  113.  
  114. template <class T>
  115. void sort(T *array, size_t begin, size_t end) {
  116.     //Пока начальный индекс меньше конечного
  117.     while (begin < end) {
  118.         //Используем концевую рекурсию если размер массива - 40
  119.         if (end - begin <= 40) {
  120.             selectionSort(array + begin, end - begin + 1);
  121.             break;
  122.         }
  123.         //Опорный элемент
  124.         size_t pivot = Partition(array, begin, end);
  125.         //Разделяй и сортируй
  126.         if (pivot - begin > end - pivot) {
  127.             sort(array, pivot + 1, end);
  128.             end = pivot - 1;
  129.         } else {
  130.             sort(array, begin, pivot - 1);
  131.             begin = pivot + 1;
  132.         }
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement