Guest User

Untitled

a guest
Jan 4th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. void radixSort(vector<int> &a) {
  9.     int max = a.at(0);
  10.     for(int i = 0; i < a.size(); ++i) if(int(fabs(a.at(i) > max))) max = a.at(i);
  11.     //hardokodiranjem bi rijesili problem donje granice za tip podatka int
  12.     for(int stepen = 1; max / stepen > 0; stepen *= 10) {
  13.         int sorting[10]{};
  14.         std::vector<int> b = a;
  15.         for(int i = 0; i < a.size(); ++i) sorting[(a.at(i) / stepen) % 10]++;
  16.         for(int i = 1; i < 10; ++i) sorting[i] += sorting[i - 1];
  17.         for(int i = a.size() - 1; i >= 0; --i) {
  18.             b[sorting[(a.at(i) / stepen) % 10] - 1] = a[i];
  19.             sorting[(a.at(i) / stepen) % 10]--;
  20.         }
  21.         a = b;
  22.     }
  23. }
  24.  
  25. int roditelj(int i) {
  26.     return int(floor((i - 1) / 2));
  27. }
  28.  
  29. int lijevo_dijete(int i) {
  30.     return 2 * i + 1;
  31. }
  32.  
  33. int desno_dijete(int i) {
  34.     return 2 * i + 2;
  35. }
  36.  
  37. bool je_li_list(std::vector<int> a, int i) {
  38.     return (i >= a.size() / 2) && i < a.size();
  39. }
  40.  
  41. void popravi_dolje(std::vector<int> &a, int i, int velicina) {
  42.     while(!je_li_list(a, i)) {
  43.         int veci = lijevo_dijete(i);
  44.         int dd = desno_dijete(i);
  45.         if(dd < velicina && a.at(dd) > a.at(veci)) veci = dd;
  46.         if(a.at(i) > a.at(veci)) return;
  47.         swap(a.at(i), a.at(veci));
  48.         i = veci;
  49.     }
  50. }
  51.  
  52. void stvoriGomilu(vector<int> &a) {
  53.         for(int i = int(floor(a.size() / 2)); i >= 0; --i) popravi_dolje(a, i, a.size());
  54. }
  55.  
  56. void popravi_gore(std::vector<int> &a, int i, int velicina) {
  57.     while(i && a.at(i) > a.at(roditelj(i))) {
  58.         swap(a.at(i), a.at(roditelj(i)));
  59.         i = roditelj(i);
  60.     }
  61. }
  62.  
  63. void umetniUGomilu(vector<int> &a, int umetnuti, int &velicina) {
  64.     a.push_back(umetnuti);
  65.     velicina++;
  66.     popravi_gore(a, velicina - 1, velicina);
  67.     stvoriGomilu(a);
  68. }
  69.  
  70. int izbaciPrvi(vector<int> &a, int &velicina) {
  71.     if(velicina == 0) throw domain_error("Gomila je prazna!");
  72.     velicina--;
  73.     int temp = a.at(0);
  74.     a.at(0) = a.at(velicina);
  75.     a.at(velicina) = temp;
  76.     if(velicina) popravi_dolje(a, 0, velicina);
  77.     return a[velicina];
  78. }
  79.  
  80. void gomilaSort(vector<int> &a) {
  81.     stvoriGomilu(a);
  82.     int velicina = a.size();
  83.     for(int i = a.size() - 1; i >= 1; --i) {
  84.         int temp = a.at(i);
  85.         a.at(i) = a.at(0);
  86.         a.at(0) = temp;
  87.         velicina--;
  88.         popravi_dolje(a, 0, velicina);
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment