Java 进行比较时的最坏情况和最佳情况
给定两个Java 进行比较时的最坏情况和最佳情况,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,给定两个double值数组,按升序排序,一个包含100个元素,另一个包含10个元素,在最佳情况和最坏情况下,在最佳算法中将这些数组合并为一个排序数组需要多少比较 答案是: 最佳案例:10个比较 最坏情况:109次比较 在你把我列为家庭作业问题或愚蠢的问题之前,先听我说完。我将解释我的推理,我制作了这个标题,好像任何人都有类似的关于迭代/比较的问题,他们可以看看这个 我理解10次比较的最佳情况,因为较短数组中的所有值都必须小于100个值的较大数组中的所有值。然后只进行一次比较并对它们进行排序 但在
double
值数组,按升序排序,一个包含100个元素,另一个包含10个元素,在最佳情况和最坏情况下,在最佳算法中将这些数组合并为一个排序数组需要多少比较
答案是:
最佳案例:10个比较
最坏情况:109次比较
在你把我列为家庭作业问题或愚蠢的问题之前,先听我说完。我将解释我的推理,我制作了这个标题,好像任何人都有类似的关于迭代/比较的问题,他们可以看看这个
我理解10次比较的最佳情况,因为较短数组中的所有值都必须小于100个值的较大数组中的所有值。然后只进行一次比较并对它们进行排序
但在最坏的情况下,我没有得到109个比较。我不知道这个问题是否要求使用合并排序对其进行比较,其中来自短数组的每个数字将进行大约7次比较(log2^100=6.64),7乘以10是70而不是109
我做错什么了吗?这个问题的答案也没有帮助。如果你们都能理解和解释,我将不胜感激
即使有了答案,我也不明白如何进行比较,如果使用了排序,则使用什么类型的排序。有人能再看一遍吗? < P>对于最坏的情况,考虑一个场景:
Array-1
:1,2,3,4,5,6,7,8,9110
Array-2
:10,11,12,13,14,15
合并这两个元素的最佳方法是比较两个数组的第一个元素(如果可用),然后取最小的元素并在该数组中继续
因此,这里如果我们计算总比较,Array-1
的前9个
元素将与Array-2
的第一个元素进行比较,因为Array-2
的第一个元素大于Array-1
的前9个元素,所以total comparison=9
现在,array-1
的最后一个元素在所有元素中是最大的,因此很明显,它将在最后合并时出现。我们仍然有所有元素出现在array-2
中,它们将与array-1
的元素进行比较
因此,这需要总计100
比较。现在总比较=100+9=109
。因此,在这种情况下,最坏的情况是进行max109
比较
编辑:
合并代码:
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
}
}
Merge(int-array1[],int-array2[]
{
int-array3[]=新的int[array1.length+array2.length];
int point1=0;//表示数组1的当前元素
int point2=0;//表示数组2的当前元素
int point3=0;//表示结果数组3的当前元素
虽然(点1因为它们都被排序了,最好的情况不应该是一次比较吗?如果第一个数组的最大元素小于第二个数组的最小元素,那么只需对数组进行合并,就可以不进行任何额外的比较了。@wotanii计算机不知道,当我们说这是一次比较时,ofc,因为我们很聪明,但是计算机不知道它的顺序。我只是没有第二个选择。哈尔普!那么这是一个合并排序吗?这是一种什么样的比较?如果是这样,它将如何实现最佳方案,因为我想我对这一点也感到困惑。在合并排序中,我们有相同大小的分区,而在这里我们有一个大小10
和ot的分区她的大小100
,但合并在两种排序中都是相同的。最好的情况是,Array-1的范围为1-10,而Array-2的范围为11-110。所以这里只需要10次比较,因为在第10次比较之后,Array-1变为空,所以我们只需要将Array-2附加到最终列表中,而不进行任何比较。