Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. using namespace std;
  4. void swap(int& a, int& b) {
  5.     int pomoc = b;
  6.     b = a;
  7.     a = pomoc;
  8. }
  9. void sort(int tab[], int l, int r) {
  10.     for (int i = 1; i <= r; i++) {
  11.         int key = tab[i];
  12.         int j = i - 1;
  13.         while (j >= l && tab[j] > key) {
  14.             tab[j + 1] = tab[j];
  15.             j--;
  16.             tab[j + 1] = key;
  17.         }
  18.     }
  19. }
  20. int partition(int tab[], int k, int l, int r) {
  21.     int i = 0;
  22.     while (tab[i] != k)i++;
  23.     swap(tab[i], tab[r]);
  24.     i = l - 1;
  25.     for (int j = l; j <= r - 1; j++) {
  26.         if (tab[j] <= k) {
  27.             i++;
  28.             swap(tab[i], tab[j]);
  29.         }
  30.     }
  31.  
  32.     swap(tab[i + 1], tab[r]);
  33.     return i + 1;
  34.  
  35. }
  36. int find_median(int tab[], int start, int end) {
  37.     sort(tab, start, end);
  38.     return tab[(end + start) / 2];
  39. }
  40. int ksmallest(int tab[], int l, int r, int k) {
  41.     if (k > 0 && k <= r - l + 1) {
  42.         int n = r - l + 1;
  43.         int *medians = new int[(n + 4) / 5];
  44.         int start = l;
  45.         int end = l + 4;
  46.         int i = 0;
  47.         while (end <= r) {
  48.             medians[i] = find_median(tab, start, end);
  49.             i++;
  50.             start = end + 1;
  51.             end = start + 4;
  52.         }
  53.         if (5 * i < n) {
  54.             medians[i] = find_median(tab, start, r);
  55.             i++;
  56.         }
  57.         int medOfMed = (i == 1) ? medians[i - 1] : ksmallest(medians, 0, i - 1, i / 2);
  58.         int pos = partition(tab, medOfMed, l, r);
  59.         if (pos - l == k - 1)return tab[pos];
  60.         if (pos - l > k - 1) return ksmallest(tab, l, pos - 1, k);
  61.         if (pos - l < k - 1) return ksmallest(tab, pos + 1, r, k - pos + l - 1);
  62.  
  63.     }
  64. }
  65. void sortFrom(int tab[], int from, int to) {
  66.     for(int i = from; i <= to; i++){
  67.         ksmallest(tab, from, to, i);
  68. }
  69. }
  70. int main()
  71. {
  72.     int tab[10] = { 4,15,2,3,17,65,8,9,13,6 };
  73.     //cout << ksmallest(tab, 0, 9, 5)<<endl;
  74.     sortFrom(tab, 3, 7);
  75.         for (int i = 0; i < 10; i++) {
  76.         cout << tab[i]<<" ";
  77. }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement