为什么这个基数排序不起作用

Why this radixSort doesn't work

本文关键字:不起作用 基数排序 为什么      更新时间:2023-10-16

看起来还可以,但结果却有所不同。真的,我不知道它怎么了。也许是因为我在晚上2点写的。。。

编辑:

template <class T>
void radixSort(T & arr, msize numberBase)
{
    long maxValue = findMax(arr);
    dynarray<long> tarr(arr,arr.size());
    dynarray<long> presenceTable(numberBase+1);
    for (register long i=0, max=presenceTable.size(); i<max; ++i)
    {
        presenceTable[i] = 0;
    }
    for (register long exp=1; maxValue/exp>0; exp*=numberBase)
    {
        for (register long i=0, max=tarr.size(); i<max; ++i)
        {
             ++(presenceTable[(tarr[i]/exp)%numberBase]);
        }
        for (register long i=1, max=presenceTable.size(); i<max; ++i)
        {
            presenceTable[i] += presenceTable[i-1];
        }
        for (register long i=0, max=tarr.size(); i<max; ++i)
        {
            arr[  (--(presenceTable[(tarr[i]/exp)%numberBase]))  ] = tarr[i];
        }
        tarr = arr;
        for (register long i=0, max=presenceTable.size(); i<max; ++i)
        {
        presenceTable[i] = 0;
        }
    }
}

尝试此代码中的算法:

#include<bits/stdc++.h>
using namespace std;
 
// Function to get maximum value in array a[].
int getmax(int a[], int n)
{
  int max = a[0];
  for (int x=1; x<n; x++)
    if (a[x] > max)
      max = a[x];
  return max;
}
 
// Function to do counting sort according to significant digits repesented by
// exp (where exp is 10^i).
void CountSort(int a[], int n, int exp)
{  
  int result[n], i, count[10] = {0};
 
  // Counting occurence of digits
  for (i =0; i <n; i++)
    count[(a[i] / exp) % 10]++;
 
  // Changing the position of count so that it appears at actual position in result.
  for (i =1; i<10; i++)
    count[i] += count[i-1];
 
  // Resultant output array
  for (i =n-1; i>= 0; i--)
  {
    result[count[(a[i] / exp) % 10] - 1] = a[i];
    count[(a[i] / exp) % 10]--;
  }
  for (i =0; i <n; i++)
    a[i] = result[i];
}
 
// Radix Sort to sort a[] of given size.
void radixsort(int a[], int n)
{
  int exp, i;
  i = getmax(a, n);
  for (exp = 1; i/exp > 0; exp *= 10)
    CountSort(a, n, exp);
}
// Driver Program
int main()
{
  int n;
  cout<<" Enter the number of elements to be sorted: ";
  cin>>n;
    int a[n];
  
  cout<<"n Enter the elements: ";
  for(int i =0; i <n; i++)
  {
    cin>>a[i];
  }
    radixsort(a, n);
 
  // Printing the sorted list.
  cout<<"nSorted List: ";
  for (int i = 0; i < n; i++)
    cout<<a[i]<<", ";
  return 0;
}

我对它做了一点更改,它对我有效。