• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ Radix sort , sortujący malejąco

Object Storage Arubacloud
0 głosów
843 wizyt
pytanie zadane 24 lutego 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 24 lutego 2019 przez dawid2002

Witam! Ostatnio sprawdzałem w internecie czy jest jakiś algorytm sortowania, który jest lepszy od quicksort. Znalazłem Radix sort , który wydaje się być świetny , ale mam tutaj kod który właśnie używa tego algorytmu , tylko że ten kod sortuje liczby w tablicy rosnąco , a ja chciałbym żeby sortował malejąco. W takim razie jakie musiałbym wprowadzić zmiany w poniższym kodzie aby sortował właśnie malejąco?

void radixsort(int *input,int n)
{
  int i;

  // find the max number in the given list.
  // to be used in loop termination part.
  int maxNumber = input[0];
  for (i = 1; i < n; i++)
  {
    if (input[i] > maxNumber)
      maxNumber = input[i];
  }

  // run the loop for each of the decimal places
  int exp = 1;
  int *tmpBuffer = new int[n];
  while (maxNumber / exp > 0)
  {
    int decimalBucket[10] = {  0 };
    // count the occurences in this decimal digit.
    for (i = 0; i < n; i++)
      decimalBucket[input[i] / exp % 10]++;

    // Prepare the position counters to be used for re-ordering the numbers
    // for this decimal place.
    for (i = 1; i < 10; i++)
      decimalBucket[i] += decimalBucket[i - 1];

    // Re order the numbers in the tmpbuffer and later copy back to original buffer.
    for (i = n - 1; i >= 0; i--)
      tmpBuffer[--decimalBucket[input[i] / exp % 10]] = input[i];
    for (i = 0; i < n; i++)
      input[i] = tmpBuffer[i];

    // Move to next decimal place.
    exp *= 10;

  }
}

 

Z góry dziękuje za pomoc!

komentarz zamknięcia: znam już odpowiedź
komentarz 24 lutego 2019 przez dawid2002 Mądrala (5,190 p.)
edycja 19 lipca 2019 przez dawid2002

Więc podsumując , kod w pytaniu sortuje rosnąco , a kod poniższy malejąco:

void radixsort(int *input,int n)
{
  int i;

  // find the max number in the given list.
  // to be used in loop termination part.
  int maxNumber = input[0];
  for (i = 1; i < n; i++)
  {
    if (input[i] > maxNumber)
      maxNumber = input[i];
  }

  // run the loop for each of the decimal places
  int exp = 1;
  int *tmpBuffer = new int[n];
  while (maxNumber / exp > 0)
  {
    int decimalBucket[10] = {  0 };
    // count the occurences in this decimal digit.
    for (i = 0; i < n; i++)
      decimalBucket[input[i] / exp % 10]++;

    // Prepare the position counters to be used for re-ordering the numbers
    // for this decimal place.
    for (i = n-2; i >= 0; i--)                        
      decimalBucket[i] += decimalBucket[i + 1];        

    // Re order the numbers in the tmpbuffer and later copy back to original buffer.
    for (i = n - 1; i >= 0; i--)
      tmpBuffer[--decimalBucket[input[i] / exp % 10]] = input[i];
    for (i = 0; i < n; i++)
      input[i] = tmpBuffer[i];

    // Move to next decimal place.
    exp *= 10;

  }
}

 

PS.

Jakby co to teraz zauważyłem, że tablica tmpBuffer nie jest zwalniana, więc jak ktoś chce skopiować kod to niech lepiej pamięta aby dodać "delete[] tmpBuffer" na końcu funkcji.

1 odpowiedź

+1 głos
odpowiedź 24 lutego 2019 przez Piotr Płatos Bywalec (2,380 p.)
wybrane 24 lutego 2019 przez dawid2002
 
Najlepsza

Musiałbyś zmienić w 33 linijce

input[i] = tmpBuffer[i];

na:

input[n-i-1] = tmpBuffer[i];

 

komentarz 24 lutego 2019 przez dawid2002 Mądrala (5,190 p.)

Nie działa :(

Jak napisałem w main taki kod:

int tab[10] = {1 , 2, 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10};

    for(int i=0;i<10;++i)
        cout << tab[i] << " ";

    cout << "   <- przed sortowaniem";
    cout << "\n\n";

    radixsort(tab,10);

    for(int i=0;i<10;++i)
        cout << tab[i] << " ";

     cout << "   <- po sortowaniu";

to wynik był taki:

komentarz 24 lutego 2019 przez Piotr Płatos Bywalec (2,380 p.)

Faktycznie, przyjrzałem się teraz dokładniej. Trzeba zmodyfikować pętle z 26 linijki.

for (i = n-2; i >=0; i--)
      decimalBucket[i] += decimalBucket[i + 1];

 

komentarz 24 lutego 2019 przez dawid2002 Mądrala (5,190 p.)
Dzięki , teraz wszystko działa! Bardzo dziękuje!

Podobne pytania

0 głosów
1 odpowiedź 443 wizyt
0 głosów
1 odpowiedź 173 wizyt

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...