让基数/计数排序与负数一起工作

Posted

技术标签:

【中文标题】让基数/计数排序与负数一起工作【英文标题】:Getting radix/counting sort to work with negative numbers 【发布时间】:2020-01-26 04:27:35 【问题描述】:

我正在进入编程领域,如果我遗漏了一些明显的东西,请原谅。 我有一个基本的 LSD 基数排序和计数排序对。 我将如何将其转换为使用负数? 这种计数排序方式是否可行,还是我需要另一种?

void radixsort(int arr[], int n) 
   int m = getMaxElement(arr, n);//Find the maximum number in array.   

   for (int exp = 1; m/exp > 0; exp *= 10)
      CountSort(arr, n, exp);


void CountSort(int arr[], int n, int exp) 

   int output[n];
   int i, c[10] = 0; // store the number of times in c[]

   for (i = 0; i < n; i++)
      c[ (arr[i]/exp)%10 ]++;


   for (i = 1; i < 10; i++)
      c[i] +=c[i - 1];
   // Making the output array
   for (i = n - 1; i >= 0; i--) 
      output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
      c[ (arr[i]/exp)%10 ]--;


   for (i = 0; i < n; i++)
      arr[i] = output[i];

【问题讨论】:

您可以在排序前后切换符号位。 【参考方案1】:

您可以将符号视为一个单独的数字,即最重要的数字。所以你的最后一次传球只有两个桶——负的和非负的。

您需要做的不同的事情是将数字从负存储桶中以相反的顺序移动到最终数组中(因为前面的传递忽略了符号,所以负数按它们的绝对值排序,这意味着相反顺序)。

【讨论】:

以上是关于让基数/计数排序与负数一起工作的主要内容,如果未能解决你的问题,请参考以下文章

计数排序基数排序桶排序

算法计数排序桶排序和基数排序详解

经典排序算法和python详解:归并排序快速排序堆排序计数排序桶排序和基数排序

数据结构与算法——计数排序桶排序基数排序

计数排序与基数排序

《数据结构与算法之美》10——排序桶排序计数排序基数排序