问题描述
我知道如何编写一种算法,该算法可以在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++;
}
}
}
对于那些反对的人,我请他们解释一下该算法的问题。从我看来,它可以满足所有的要求。