写入按不止一次绘制的升序编号排序。 [ C ]

时间:2017-11-17 10:40:58

标签: c

我无法解决这个问题 problem

此代码超出了时间限制,所以我需要让时间复杂度变得更加模糊,我认为

  #include <stdio.h> 
  int main() 
  {
    int a[100000], i, j, min, b, tmp;
    scanf("%d", &b); 
    for (i = 0; i < b; i++)
    {
      scanf("%d", &a[i]);
    }

    for (i = 0; i < b; i++)
    {
      min = a[i];
      tmp = i;
      for (j = i; j < b-1; j++) 
      {
        if (min > a[j]) 
        {
           min = a[j];
           tmp = j;
        }
      }
      a[tmp] = a[i];
      a[i] = min;
      if (i > 0) 
      {
        if (a[i-2] != a[i] && a[i] == a[i-1]) printf("%d\n", a[i]);
      }   
    }

    return 0;
  };

1 个答案:

答案 0 :(得分:0)

您的排序算法具有复杂度O(n^2)。对于大小为10^5的输入,它比O(nlogn)快速排序算法要多许多倍。

在这里,您可以使用qsort()来解决问题。

qsort(a, b, sizeof int, cmp);

cmp

的位置
int cmp(const void *a, const void *b)
{
    return (*(int *) a - *(int *) b);
}

排序后的算法要简单得多。

int p = a[0], ct=0;
for(size_t i = 1; i<=b-1; i++)
{
    if( a[i] == a[i-1])
       ct++;
    else{
       if( ct > 1){
       // a[i-1] should be printed.
       }
       ct = 1;
    }
}
if( ct > 1){
   //a[b-1] should also be print.
}

这个想法是这样的

  
      
  • 随着数字的排序,我们将得到一个单调的序列。

  •   
  • 我们将每个数字与之前的数字进行比较。如果有重复,则它们将显示在下一个旁边。

  •   
  • 我们只收集多次出现的数字。

  •   

此外,您可以遵循的内容很少

  • 在方法中声明大变量有时会受到可用内存(自动存储持续时间)的限制。(可能有stackoverflow等)使其成为全局。(静态存储持续时间)。

  • 变量名称不是readable

  • 如果使用排序算法,您可以获得帮助。

  • 了解不同算法的复杂性有所帮助。在你的情况下,复杂性是O(n ^ 2)。比这更好的排序算法是流行的合并排序等。这个简单的想法解决了你的问题。

您可以检查一下,此代码至少比您的版本更具可读性。这有助于避免小错误。

 int temp = a[0], count=0;
for(size_t i = 1; i<=len-1; i++)
{
    if( arr[i] == arr[i-1])
       count++;
    else{
       if( count > 1){
       // a[i-1] should be printed.
       }
       count = 1;
    }
}
if( count > 1){
   //arr[len-1] should also be print.
}