sortowanie - co przejscie odejmowanie jeden od wartosci

0

Cześć, mam wykonać zadanie, które polega na sortowaniu od największej do najmniejszej, ale jeśli jakaś liczba przechodzi na przykład dwa pola do przodu, to jej wartość zmniejsza się o dwa. wykonałem do tej pory sortowanie i kombinowałem odnośnie tego zmniejszania, ale nie wychodzi Mi to, znaczy się, zmniejszają się wartości, oprócz pierwszej.

przykładowo:
input:
5 - ilość liczb do posortowania
1 2 3 2 4

output
0 2 1 0 0

#include <iostream>

using namespace std;
void sort(int tab[], int w);
int main()
{
  int n;
  cin >> n;
  int a[n];

  for(int i = 0; i < n; i++)
    cin >> a[i];

    sort(a,n);
    for(int i = 0; i < n; i++)
      cout << a[i] << endl;
  return 0;
}

void sort(int *tab, int w){
    for(int i = 1; i < w; i++){
        for(int j = (w-1); j >= 1; j--){
            if(tab[j] > tab[j-1]){
                tab[j-1]--;
                int x = tab[j-1];
                tab[j-1] = tab[j];
                tab[j] = x;
            }
        }
    }

    }

Zmniejszanie wartości powinno zawierać się w instrukcji warunkowej if, gdyż ona wykonuje się jeśli dany element jest większy od poprzedniego, czyli wykonuje się przesunięcie.
Będe wdzięczny jeśli ktoś Mi w tym pomoże.

0

Bardzo przepraszam że to "Mi", nie wiem co mnie napadło, prawdopodobnie późna godzina, nie miałem zamiaru się wywyższać i prepraszam jeśli ktoś poczuł się urażony.

0

Podaj dokładnie treść zadania. Zdajesz sobie sprawę, że zależnie od typu sortowania i danych wejściowych, jedna wartość może wędrować w przód i w tył?
Jak ją zmieszasz przy przejściu na początek, po chwili może wrócić na swoje oryginalne miejsce bo jedna z następujących wartości może ją wypchnąć w kierunku końca.

Jeśli pokażesz dokładnie treść zadania, to może się okazać, że najpierw lepiej zrobić sortowanie na kopii, a potem porównując posortowaną kopię z oryginałem, uaktualnić ich wartości o przesunięcia ich pozycji.

0

wielkości liczb opisane są liczbami naturalnymi,
liczba przeniesiona o k pozycji traci na wielkości k jednostek,
oczywiście liczba 0 już nie traci na wielkości

Napisz program, który wczyta ciąg liczb opisujący wielkości kolejnych liczb i wypisze je po "uporządkowaniu".

0

Zgodnie z opisem powyżej to nie jest to o co chodzi, ale powinno cię naprowadzić na właściwe rozwiązanie:

#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;

struct Data {
    Data(int value,
         int initialPos)
        : value(value), initialPos(initialPos)
    {}
   
    int value;
    int initialPos;
};

vector<Data> readData(istream& input)
{
    vector<Data> result;
    int dataSize;
    if (input >> dataSize)
    {
         for (int i=0; i < dataSize; ++i) {
              int x;
              if (input >> x)
                     result.emplace_back(x, i);
         }
    }
    return result;
}

ostream& printVector(ostream& output, const vector<Data>& v)
{
    for (auto& x : v) {
        output << x.value << ", ";
    }
    return output;
}

void positionCorrection(vector<Data>& v)
{
     int_t i = 0;
     for (auto& x : v) {
           x.value += i - x.initialPos;
           ++i;
     }    
}

int main()
{
    auto data = readData(cin);
    printVector(cout, data) << endl;  
    sort(begin(data), end(data), [](const auto& a, const auto& b) { return a.value < b.value; });
    printVector(cout, data) << endl;
    positionCorrection(data);
    printVector(cout, data) << endl;    
}

https://wandbox.org/permlink/yNNajo7BJik0pDOw

1 użytkowników online, w tym zalogowanych: 0, gości: 1