我正在尝试解决一个问题,我将使用合并排序来获得以下情况: 在n个元素的数组中
获得数组中的最小数字,然后得到最大数字SO它们的减法(或这些数字之间的差异最大)
例如: n = 8 arr {7,8,10,20,4,19,50,70} 我想得到4和70,因为他们的差别是66 如果我得到最低和最大数字真的没关系,我只关心它们减法的最大差异。此外,第一个数字必须低于第二个,不允许70和4。
因为这个问题需要我修改合并排序代码,我想:1)将所有数字分成1,2的数组,将数组中的i数与i + 1数进行比较,如果我编号最低然后得到他们的差异并继续移动阵列中的所有位置。
你怎么看?我在设置基本情况时遇到问题:S请帮忙!答案 0 :(得分:0)
基本的合并排序对您的数组进行排序,因此您可以轻松获得最大和最小的数字。但是你只是试图修改数组,这样你才能获得最大和最小的数字 - 你不关心中间数字。一旦你认出它们,它们就是垃圾。
如何识别您正在查看的号码是否无用?好吧,如果情况是它既不是当前范围内的最小数字也不是最大数字。
首先查看用于合并排序的伪代码。您可以做出哪些最小的改变来更紧密地解决这个问题?
答案 1 :(得分:0)
Merge-sort的理念是将较小片段的结果合并为较大的片段。
在merge-sort中,首先将2个元素(1个元素的2个数组)合并为2个元素的排序数组,然后将2个元素的2个排序数组合并为4个元素的排序数组(因为2个数组是排序后,你只需要遍历和比较,较小的元素总是以升序排列在两个数组中,然后将2个排序的4个元素数组合并为8个元素的排序数组。
| | | | | | | | | |sorted | | | | |sorted | | |sorted |
现在,您只需要找到最大和最小的,因此,您只需要找到2个元素中最大和最小的元素。比较来自2个元素的2个数组中的2个最大元素并找到更大的元素,然后比较4个元素的2个数组中的2个最大元素并找到更大的元素,依此类推。 (同样适用于小方。)
| | | | | | | | | |S L| | | | |Smllst Lrgst| | |only need to care about S & L |
换句话说,您不再对整个数组进行排序,而是找到最大和最小的并合并结果以获得最终答案。
顺便说一下,我认为这有点像快速选择快速排序。