Считать Сортировка путаницы. Не сортируемый массив (c ++)

0

Я изучал сортировку и решил попробовать алгоритм, который я нашел в Интернете. Хотя, похоже, он не сортирует мой массив.

void countSort2(int arr[], int n, int exp)
{
    int *output = new int[n]; // output array
    int i, count[10] = {0};

    // Store count of occurrences in count[]
    for (i = 0; i < n; i++)
        count[ (arr[i]/exp)%10 ]++; 

    // Change count[i] so that count[i] now contains actual position of
    // this digit in output[]
    for (i = 1; i < 10; i++)
        count[i] += count[i - 1];

    // Build the output array
    for (i = n - 1; i >= 0; i--)
    {
        output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
        count[ (arr[i]/exp)%10 ]--;
    }

    // Copy the output array to arr[], so that arr[] now
    // contains sorted numbers according to curent digit
    for (i = 0; i < n; i++)
        arr[i] = output[i];
}

int main()
{
    int b[10] = {4,3,2,1,6,7,8,9,7,6};
    countSort2(b,10,10);
    int i = 0;
    while(i<10)
    {
        cout<<b[i]<<endl;
        i++;
    }

Когда массив распечатывается, я получаю: "4,3,2,1,6,7,8,9,7,6". Я вызываю функцию неправильно?

  • 0
    Не будет ли arr[i]/exp всегда работать как ноль? Все ваши элементы arr меньше, чем exp=10 , и это целочисленное деление. И я не понимаю ваш цикл сборки-вывода: когда он решит перейти к следующему элементу в count ?
  • 0
    Оу, я назвал это с countsort2 (б, 10,1), и он все это отсортировал! Как бы я пошел о сортировке чисел больше, чем однозначные числа?
Показать ещё 1 комментарий
Теги:
algorithm
sorting

2 ответа

1
Лучший ответ

Так вы называете метод [1].

10 - количество элементов...

int main()
{
   int b[10] = {14,23,22,11,66,67,58,49,17,16};
    countSort2(b,10,1);
    countSort2(b,10,10);

    int i = 0;
    while(i<10)
    {
        cout<<b[i]<<endl;
        i++;
    }
   return 0;
}
0

Это сортировка radix, которая сортирует массив по десятичной цифре. Сортировка выполняется от наименее значащей цифры до самой значащей цифры. Это означает серию вызовов с exp = 1, 10, 100, 1000, 10000,....

Ниже приведен пример сортировки radix, который сортирует массив из 64-битных целых чисел без знака по байтам в целых числах, от наименее значимых до наиболее значимых. В этом примере временный массив передается как параметр RadixSort():

typedef unsigned __int64    UI64;
typedef unsigned __int64 *  PUI64;

PUI64 RadixSort(PUI64 pData, PUI64 pTemp, size_t count)
{
size_t mIndex[8][256] = {0};            // index matrix
PUI64 pDst, pSrc, pTmp;
size_t i,j,m,n;
UI64 u;

    for(i = 0; i < count; i++){         // generate histograms
        u = pData[i];
        for(j = 0; j < 8; j++){
            mIndex[j][(size_t)(u & 0xff)]++;
            u >>= 8;
        }       
    }
    for(j = 0; j < 8; j++){             // convert to indices
        n = 0;
        for(i = 0; i < 256; i++){
            m = mIndex[j][i];
            mIndex[j][i] = n;
            n += m;
        }       
    }

    pDst = pTemp;                       // radix sort
    pSrc = pData;
    for(j = 0; j < 8; j++){
        for(i = 0; i < count; i++){
            u = pSrc[i];
            m = (size_t)(u >> (j<<3)) & 0xff;
            pDst[mIndex[j][m]++] = u;
        }
        pTmp = pSrc;
        pSrc = pDst;
        pDst = pTmp;
    }

return(pSrc);

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню