给出大小分别为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秒 提示:请优化您的代码,然后再次提交。
答案 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];
}