两个排序数组的第K个元素

时间:2019-05-14 14:30:26

标签: arrays sorting optimization

给出大小分别为M和N的两个排序数组A和B以及元素k。我们的任务是找到位于最终排序数组第k个位置的元素。

问题来自GeeksforGeeks

这是我为上述问题编写的代码。我刚刚将给定的两个数组串联到第三个数组中,然后对其进行了排序。我用C语言编写。我缺乏有关如何以优化方式编写代码的知识。请让我知道如何优化代码,以减少执行时间,以帮助我。

 for (i = 0; i <= n1 - 1; i++)
{
  scanf ("%d", &a[i]);
}
  for (i = 0; i <= n2 - 1; i++)
{
  scanf ("%d", &b[i]);
}
  for (i = 0; i < n1; i++)
{
  c[i] = a[i];
}
  for (j = n1, i = 0; j <= z - 1 && i <= n2 - 1; j++, i++)
{
  c[j] = b[i];
}
  for (i = 0; i <= z - 1; i++)
{
  for (j = i + 1; j <= z - 1; j++)
    {
      if (c[i] > c[j])
    {
      temp = c[j];
      c[j] = c[i];
      c[i] = temp;
    }
    }
}
  printf ("%d", c[q]);

我有输出,但是我面临的问题是.. 您的程序花费的时间比预期的要多。 预期时限<0.324秒 提示:请优化您的代码,然后再次提交。

1 个答案:

答案 0 :(得分:0)

MergeSort的一些伪代码,该算法可有效地合并两个排序的数组,这是最坏情况下的最佳选择:

function void mergesort(S array; l,r integer) {
    if (l<r) then
    #Sort each
        ~50% of array
        m := (r-l)
        div 2;
        mergesort(S, l, l+m);
        mergesort(S, l+m+1, r);
        #merges two sorted lists
        merge( S, l, l+m ,r);
    else
        # Nothing to do, 1-element list
    end if;
}


function void merge(S array; l,m,r integer) {
    B: array[1..r-l+1];
    i := l;
    # Start of 1st list
    j := m+1;
    # Start of 2nd list
    k := 1;
    # Target list
    while (i<=m) and (j<=r) do
        if S[i]<=S[j] then
            B[k] := S[i]; # From 1st list
            i := i+1;
        else
            B[k] := S[j]; # From 2nd list
            j := j+1;
        end if;
        k := k+1;
    # Next target
    end while;
    if i>m then
    # What remained?
        copy S[j..r] to B[k..k+r-j];
    else
        copy S[i..m] to B[k..k+m-i];
    end if;
    # Back to original list
    copy B[1..r-l+1] to S[l..r];
}