这是我几天来一直试图解决的问题。
我需要编写一个获取排序数组的程序。程序会将 999 放在两个相邻块具有相同值的位置,然后将所有 999 放在数组的末尾。我需要在不使用另一个数组的情况下执行此操作,并且程序必须是 O(n)。
示例输入:
50,60,60,72,81,81,81,81,93,93
所需的输出:
50,60,72,81,93,999,999,999,999,999
另一个例子:
1,1,2,3,4,4,5,6,6
所需的输出:
1,2,3,4,5,6,999,999,999
我的代码。它不工作。对于第一个示例,输出没问题。对于第二个示例,我得到 1,2,3,4,5,4,5,6,-14568127(超出数组范围)
我的算法是我用两个索引 i 和 j 遍历数组,如果 a[i]!=a[i+1] 然后我推进 i。如果它们相等,则 j 查找下一个唯一值,并将其放入 a[i+1]。
我很想听听更好的想法或代码来做到这一点。在 C.
while((j!=size-1)&&(a[size-1]!=a[i]))
{
if(a[i]!=a[i+1])
{
i++;
j=i;
}
if(a[i]==a[i+1])
{
j=i;
while(a[i]==a[j])
j++;
a[i+1]=a[j];
i++;
if(j!=size-1)
j=i;
}
}
i++
for(;i<size;i++)
a[i]=999;
我已经编辑了代码,现在我按照陈的建议进行了。首先,我遍历数组,将 999 放在双打所在的位置,但当我想切换时出现问题。这是我为重新排序数组而编写的代码:每次我将 999 放在某个地方时,count++。
它适用于我完美给出的两个示例。谢谢大家。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int *a;
int i=0,j=0,size,count=0;
printf("Enter the size of the array\n");
scanf("%d", &size);
a=(int *)calloc(size,sizeof(int));
printf("Enter %d numbers\n",size);
for(i=0;i<size;i++)
scanf("%d",&a[i]);
printf("The array recieved is :\n");
for(i=0;i<size;i++)
printf(" %d ", a[i]);
i=0;
printf("\n");
for(i=0;i<size;i++)
{
if(a[i]==a[i+1])
{
j=i+1;
while(a[i]==a[j])
{
a[j]=999;
j++;
}
count++;
}
}
while(count!=0)
{
for(i=0;i<size-1;i++)
{
j=i;
if(a[j]==999)
{
a[j]=a[j+1];
a[j+1]=999;
}
}
count--;
}
printf("The new array is: \n");
for(i=0;i<size;i++)
printf(" %d ",a[i]);
free(a);
getch();
}