1

Тема: Як в методі сортування підрахунком з зростання зробити спадання?

Є такий код:

int max = INT_MIN, min = INT_MAX;
    for (int i = 0; i < n; i++) {
        if (ar[i] > max)
            max = ar[i];
        if (ar[i] < min)
            min = ar[i];
    }
    int* c = new int[max + 1 - min];
    for (int i = 0; i < max + 1 - min; i++) {
        c[i] = 0;
    }
    for (int i = 0; i < n; i++) {
        c[ar[i] - min] = c[ar[i] - min] + 1;
    }
    int i = 0;
    for (int j = min; j < max + 1; j++) {
        while (c[j - min] != 0) {
            ar[i] = j;
            c[j - min]--;
            i++;
        }
    }

Що потрібно зробити щоб зробити сортування спаданням замість зростання, буду вдячний за допомогу

2

Re: Як в методі сортування підрахунком з зростання зробити спадання?

1.Не суттєво,але щось тут не на своїх місцях ))

int max = INT_MIN, min = INT_MAX;


2.  Раз є new [], отже має бути десь delete[].

    int* c = new int[max + 1 - min];
    for (int i = 0; i < max + 1 - min; i++) {
        c[i] = 0;
    }

    // delete [] c;

3.

    int i = 0; // Тут почати відлік від кінця масиву n - 1
    for (int j = min; j < max + 1; j++) {
        while (c[j - min] != 0) {
            ar[i] = j;
            c[j - min]--;
            i++; // А тут потрібен декремент (--) 
        }
    }
Подякували: g0frik1

3

Re: Як в методі сортування підрахунком з зростання зробити спадання?

lucas-kane написав:

1.Не суттєво,але щось тут не на своїх місцях ))

int max = INT_MIN, min = INT_MAX;

Усе там на своїх місцях.

По основному питанню - треба в останньому циклі йти від max до min, якщо не розумієте чому - спробуйте своїми словами описати, що відбувається в циклах.

Подякували: g0frik, leofun012

4

Re: Як в методі сортування підрахунком з зростання зробити спадання?

#include <climits>
#include <iostream>
using namespace std;

int main()
{
    int ar[] = { 9, -2, 27, 7, 0, -3, 1, 2, 6, 9, -32 };
    int n = sizeof ar / sizeof ar[0];
   
    int max = INT_MIN, min = INT_MAX;
    for (int i = 0; i < n; i++) {
        if (ar[i] > max)
            max = ar[i];
        if (ar[i] < min)
            min = ar[i];
    }
    int* c = new int[max + 1 - min];
    for (int i = 0; i < max + 1 - min; i++) {
        c[i] = 0;
    }
    for (int i = 0; i < n; i++) {
        c[ar[i] - min] = c[ar[i] - min] + 1;
    }
    int i = n - 1;
    for (int j = min; j < max + 1; j++) {
        while (c[j - min] != 0) {
            ar[i] = j;
            c[j - min]--;
            i--;
        }
    }
    delete[] c;

    for (int i = 0; i < n; i++)
        cout << ar[i] << ' ';
    cout << '\n';

    return 0;
}

Так дійсно все на своїх місцях. Не помітив, що це макроси із бібліотеки limits.h

int max = INT_MIN, min = INT_MAX;
for (int i = 0; i < n; i++ {
koala написав:

По основному питанню - треба в останньому циклі йти від max до min, якщо не розумієте чому - спробуйте своїми словами описати, що відбувається в циклах.

    int i = 0;
    for (int j = min; j < max + 1; j++) {
        while (c[j - min] != 0) {
            ar[i] = j; // Для чого йти від max до min, якщо будування сортованого масиву тут... ?
            c[j - min]--;
            i++;
        }
    }
Подякували: g0frik1

5

Re: Як в методі сортування підрахунком з зростання зробити спадання?

На ваш смак.

Подякували: g0frik1