是否存在一种稳定的排序算法,可以按On时间复杂度和O1辅助空间复杂度对二进制数组进行排序?

问题描述

我知道如何编写一种算法,该算法可以在O(n)时间和O(1)辅助空间复杂度中对二进制数组进行排序,但是它似乎不稳定。

void binarySort(int arr[],int arr_size)
{
  int i;
  int count_zeros=0;
  for (i=0 ; i<arr_size ; i++)
  {
    if(arr[i]==0)
      count_zeros++;
  }
    int j;
    for(j=0 ; j<count_zeros ; j++)
      arr[j]=0;
    int k;
    for(k=j ; k<arr_size ; k++)
      arr[k]=1;
}

考虑我想使用稳定排序算法作为子例程来执行二进制基数排序。这是一个示例,其中我们根据最低有效位排序。

输入:11,101,1000,1010,111,110,10

输出1000,10,11,111

请注意,在上面的示例中,具有相同LSB的二进制数字的顺序被保留。

有什么方法可以编辑上述算法或创建新算法,使排序算法稳定,同时保留O(n)时间复杂度和O(1)辅助空间复杂度?

来自Wikipedia:稳定的排序算法使用相同的键(即值)来维持记录的相对顺序。也就是说,如果只要有两个记录R和S具有相同的键且R出现在原始列表中的S之前,而R出现在排序列表中的S之前,则排序算法是稳定的。 对于那些说稳定无关紧要的人,请阅读此post

解决方法

我认为我可能想出了一种稳定的排序算法,该算法具有O(n)时间复杂度和O(1)辅助空间复杂度。如果有人可以验证它满足所有属性,我将不胜感激。我也希望看到其他解决此问题的方法。您可以尝试运行here

void binarySort(int arr[],int arr_length)
{
  int i,count=1;
  for(i=0 ; i<arr_length ; i++)
  {
    if(arr[i]==1)
    {
      arr[i]=count;
      count++;
    }
  }
  int num0s=arr_length-count+1;
  int j=0;
  int k=0;
  while(j<num0s)
  {
    if(arr[k]==0)
    {
      int temp=arr[k];
      arr[k]=arr[j];
      arr[j]=temp;
      j++;
    }
    k++;
  }
  int a;
  for(a=0 ; a<arr_length-num0s ; )
  {
    if(arr[num0s+a]!=a+1)
    {
      int temp=arr[num0s+a];
      arr[num0s+a]=arr[num0s+temp-1];
      arr[num0s+temp-1]=temp;
    }
    else
    {
      arr[num0s+a]=1;
      a++;
    }
  }
}

对于那些反对的人,我请他们解释一下该算法的问题。从我看来,它可以满足所有的要求。