我正在尝试实现合并排序,但我得到的输出是相同的数组。这个合并排序给了我与input.plz help.i'相同的输出。我很确定实现是正确的我试过调试但是无法弄清楚错误。
解决:我正在将助手[左]与助手[中]进行比较,而不是右手助手。谢谢你的帮助。
public class Sort {
public static void main(String[] args){
int arr[] = {3,5,6,9,0,2,4};
Sort sort = new Sort();
int i=0;
sort.MergeSort(arr);
for(i=0;i<arr.length;i++){
System.out.print(arr[i]);
}
}
private void MergeSort(int[] arr2) {
// TODO Auto-generated method stub
int helper[] = new int[arr2.length];
MergeSort(arr2,helper,0,arr2.length-1);
}
private void MergeSort(int[] arr2,int[] helper,int start, int end) {
if(start<end){
int mid = (start+end)/2;
MergeSort(arr2,helper,start,mid);
MergeSort(arr2,helper,mid+1,end);
Merge(arr2,helper,start,mid,end);
}else{
//do nothing
}
}
private void Merge(int[] arr2, int[] helper, int start, int mid, int end) {
// TODO Auto-generated method stub
int i;
for(i=start;i<=end;i++){
helper[i]=arr2[i];
}
i=start;
int left = start;
int right = mid+1;
while(left <= mid && right <= end){
if(helper[left] <= helper[mid]){
arr2[i] = helper[left];
left++;
}else{
arr2[i] = helper[right];
right++;
}
i++;
}
//move remaining of left to array
int remaining = mid-left;
int j;
for(j=0;j<=remaining;j++){
arr2[i+j]=helper[left+j];
}
}
}
答案 0 :(得分:3)
整蛊......: - )
您始终将left
处的元素与mid
处的元素进行比较,而不是right
处的元素:
while(left <= mid && right <= end){
if(helper[left] <= helper[mid]){
应该是
while(left <= mid && right <= end){
if(helper[left] <= helper[right]){
可选,但更清楚:
此外,正如马特所提到的,你缺少从右臂追上剩余价值
while (left <= mid)
arr2[i++] = helper[left++];
while (right <= end) {
arr2[i++] = helper[right++];
编辑:将右臂追赶标记为可选
答案 1 :(得分:1)
我认为你的merge()函数缺少某种情况。
//move remaining of left to array
int remaining = mid-left;
int j;
for(j=0;j<=remaining;j++){
arr2[i+j]=helper[left+j];
}
如果右子阵列首先耗尽,会处理,但如果左子阵列首先耗尽则不考虑这种情况(这可能会导致一些异常结果)。我知道这不是你要问的问题,我会继续查看你的代码,看看我是否可以提供帮助。
快乐的编码!如果您有任何问题,请发表评论。