我有一个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++;
}
}
答案 0 :(得分:3)
要将n
- 元素数组与m
- 元素数组合并,您需要在最坏的情况下进行n+m-1
次比较(最好是min{m,n}
)。
因此,当您将10个元素的数组拆分为一半时,顶级合并最多需要进行9次比较。这两个5个元素的一半最多需要进行4次比较,得到9 + 2*4 = 17
。将2元素和3元素部分中的5个元素分成两半需要最多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