1

我有一个 10 个 int 的数组,使用选择排序我计算出大约需要 45 次比较才能对整个数组进行排序,但我不确定使用合并排序需要多少次才能通过我的计算进行排序,它需要 12 次比较...... . 我在这里是对还是错?

提前致谢

这是合并方法

static void merge(int[] first, int[] second, int[] a)
    {
        int iFirst = 0;
        int iSecond = 0;
        int i = 0; 
        //moving the smaller element into a
        while(iFirst < first.length && iSecond < second.length)
        {
            if(first[iFirst] < second[iSecond])
            {
                a[i] = first[iFirst];
                iFirst++;
            }
            else
            {
                a[i] = second[iSecond];
                iSecond++;
            } 
            i++;             
        }
        counter += i;

        //copying the remaning of the first array
        while(iFirst < first.length)
        {
            a[i] = first[iFirst];
            iFirst++; i++;
        }
        //copying the remaining of second array
        while(iSecond < second.length)
        {
            a[i] = second[iSecond];
            iSecond++; i++;
        }        
    }
4

1 回答 1

3

要将n-element 数组与m-element 数组合并,您需要n+m-1在最坏的情况下(min{m,n}最好的情况下)进行比较。

因此,当您将 10 元素数组一分为二时,顶层合并最多需要 9 次比较。两个 5 元素半部分每个需要最多 4 次比较,使得9 + 2*4 = 17. 将 5 元素的一半拆分为 2 元素和 3 元素的部分需要最多 1 + 3 次比较,因此最坏的情况总共将是 25 次比较 (9 + 2*4 + 2*3 + 2*1)。

                10(9)                             9
               /     \
              /       \
             /         \
            /           \
           /             \
          /               \
         /                 \
        5(4)               5(4)                   8
       /   \              /   \
      /     \            /     \
    3(2)     2(1)      3(2)     2(1)              6
   /   \    /   \     /   \    /   \
  2(1)  1  1     1   2(1)  1  1     1             2
 /   \              /   \
1     1            1     1
于 2012-05-26T21:10:29.323 回答