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
。因此,在这种情况下,最坏的情况是进行max
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    
    }
}
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附加到最终列表中,而不进行任何比较。