Advertisement
ilyakanyshev

Untitled

Dec 5th, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream>
  3. #define MAXSTACK 2048 // максимальный размер стека
  4. void qSortI(int a[], long size) {
  5.      
  6.     long i, j; // указатели, участвующие в разделении
  7.     long lb, ub; // границы сортируемого в цикле фрагмента
  8.      
  9.     long lbstack[MAXSTACK], ubstack[MAXSTACK]; // стек запросов
  10.     // каждый запрос задается парой значений,
  11.     // а именно: левой(lbstack) и правой(ubstack)
  12.     // границами промежутка
  13.     long stackpos = 1; // текущая позиция стека
  14.     long ppos; // середина массива
  15.     int pivot; // опорный элемент
  16.     int temp;
  17.      
  18.     lbstack[1] = 0;
  19.     ubstack[1] = size-1;
  20.      
  21.     do {
  22.         // Взять границы lb и ub текущего массива из стека.
  23.         lb = lbstack[ stackpos ];
  24.         ub = ubstack[ stackpos ];
  25.         stackpos--;
  26.              
  27.         do {
  28.             // Шаг 1. Разделение по элементу pivot
  29.             ppos = ( lb + ub ) >> 1;
  30.             i = lb; j = ub; pivot = a[ppos];
  31.             do {
  32.                 while ( a[i] < pivot ) i++;
  33.                 while ( pivot < a[j] ) j--;
  34.                 if ( i <= j ) {
  35.                     temp = a[i]; a[i] = a[j]; a[j] = temp;
  36.                     i++; j--;
  37.                 }
  38.             } while ( i <= j );
  39.          
  40.             // Сейчас указатель i указывает на начало правого подмассива,
  41.             // j - на конец левого (см. иллюстрацию выше), lb ? j ? i ? ub.
  42.             // Возможен случай, когда указатель i или j выходит за границу массива
  43.              
  44.             // Шаги 2, 3. Отправляем большую часть в стек и двигаем lb,ub
  45.             if ( i < ppos ) { // правая часть больше
  46.                 if ( i < ub ) { // если в ней больше 1 элемента - нужно
  47.                     stackpos++; // сортировать, запрос в стек
  48.                     lbstack[ stackpos ] = i;
  49.                     ubstack[ stackpos ] = ub;
  50.                 }
  51.                 ub = j; // следующая итерация разделения
  52.                 // будет работать с левой частью
  53.             } else { // левая часть больше
  54.                 if ( j > lb ) {
  55.                 stackpos++;
  56.                 lbstack[ stackpos ] = lb;
  57.                 ubstack[ stackpos ] = j;
  58.                 }
  59.                 lb = i;
  60.             }
  61.         } while ( lb < ub ); // пока в меньшей части более 1 элемента
  62.     } while ( stackpos != 0 ); // пока есть запросы в стеке
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement