给定两个
double
值数组,按升序排序,一个包含100个元素,另一个包含10个元素,在将这些数组合并为一个排序数组的最佳算法中需要进行多少次比较,最好的情况,在最坏的情况下?
答案是:
最佳案例:10次比较
最坏情况:109比较
在你把我作为家庭作业问题或愚蠢的问题标记出来之前,请听我说。我将解释我的推理,并且我做了标题,好像任何人都有关于迭代/比较的类似问题,他们可以看一下。
我理解10次比较的最佳情况,因为较短数组中的所有值必须小于100个值的较大数组的所有值。然后你只进行一次比较并对它们进行排序。
但是对于最糟糕的情况,我没有得到109次比较。我不知道问题是要求使用合并排序来比较它,其中短阵列中的每个单个数字将进行大约7次比较(log2 ^ 100 = 6.64),7次10是70而不是109。
我做错了吗?这个问题的答案也没有帮助。如果你们都能理解并解释这一点,我们将不胜感激。
即使有了答案,我也不了解如何进行比较以及使用何种类型的排序(如果使用的话)。有人可以再看一遍吗?
答案 0 :(得分:2)
对于最坏的情况,请考虑
的情况 Array-1
:1,2,3,4,5,6,7,8,9,110
。
Array-2
:10,11,12,13,14,15,.....,109
。
合并它们的最佳方法是比较两个数组的第一个元素(如果可用),然后取最小值并继续进行该数组。
因此,如果我们计算总比较次数,First 9
的{{1}}元素将与Array-1
的第一个元素进行比较,因为Array-2
的{{1}}元素更大到目前为止first
所以Array-2
的{{1}}元素。
现在first 9
的最后一个元素在所有元素中是最大的,所以很明显它最终会在合并中出现但是Array-1
中存在Total Comparisons = 9
个元素,这些元素将与array-1
的元素。
所以这需要进行总计all
次比较。现在array-2
。所以在这种情况下,最坏的情况是最大array-1
比较。
修改强>
合并代码:
100
所以这里当我们比较两个数组的元素时,它被算作比较。最好的情况,
Total Comparisons = 100 + 9 = 109
= 109
。
Merge(int array1[],int array2[])
{
int array3[]=new int[array1.length+array2.length];
int point1=0; //indicating current element of array1
int point2=0; //indicating current element of array2
int point3=0; //indicating current element of resultant array3
while(point1<array1.length && point2<array2.length)
{
if(array1[point1]>array2[point2]) //This is to be counted as a comparison
{
array3[point3]=array2[point2]; //Take element of array2
point2++; //move to the next element of array2
point3++; //move to the next element of array3
}
else
{
array3[point3]=array1[point1]; //Take element of array3
point1++; //move to the next element of array1
point3++; //move to the next element of array2
}
}
while(point1<array1.length)
{
array3[point3]=array1[point1]; //Take element of array3
point1++; //move to the next element of array1
point3++; //move to the next element of array2
}
while(point2<array2.legnth)
{
array3[point3]=array2[point2]; //Take element of array2
point2++; //move to the next element of array2
point3++; //move to the next element of array3
}
}
= Array-1
。
因此,此处的总比较将为1,2,3,4,5,6,7,8,9,10
,在Array-2
比较后,11,12,13,14,.....,110
将变为空(所有元素都将被采用)。因此,不会进行更多的比较。因此,最佳情况下的总体比较为10
。
如果要打印任何输入的总比较,请在算法中进行少量更改。
定义一个变量10
,然后每次进行比较时,递增它。因此,在比较条件下进行更改:
Array-1
然后最后打印10
。这是了解逻辑的更好方法。