Java合并排序递归算法

Java合并排序递归算法,java,arrays,algorithm,recursion,Java,Arrays,Algorithm,Recursion,我有一个小问题。 我尝试实现递归的合并排序算法 int sort_list[] = {5, 9, 7, 8, 3, 4, 5, 6, 1, 0}; int[] left = new int[sort_list.length]; int[] right = new int[sort_list.length]; public Mergesort() { int[] lv_sorted_list = mergeSort(sort_list); for (int i = 0; i &l

我有一个小问题。 我尝试实现递归的合并排序算法

int sort_list[] = {5, 9, 7, 8, 3, 4, 5, 6, 1, 0};
int[] left = new int[sort_list.length];
int[] right = new int[sort_list.length];

public Mergesort() {
    int[] lv_sorted_list = mergeSort(sort_list);
    for (int i = 0; i < lv_sorted_list.length; i++) {
        System.out.print(" " + lv_sorted_list[i] + ", ");
    }
}

int[] mergeSort(int[] iv_sort_list) {

   for (int i = 0; i < iv_sort_list.length; i++) {
       System.out.print("Divide: " + iv_sort_list[i] + " ");
    }
    System.out.println("");

    if (iv_sort_list.length > 1) {
        left = mergeSort(Arrays.copyOfRange(iv_sort_list, 0, iv_sort_list.length / 2)); 
        right = mergeSort(Arrays.copyOfRange(iv_sort_list, iv_sort_list.length / 2, iv_sort_list.length)); 
    } 
    int i = 0;
    int j = 0;
    int[] sorted_list = new int[left.length + right.length];
    while (i < left.length && j < right.length) {
        if (left[i] > right[j]) {
            int tmp = left[i];
            left[i] = right[j];
            right[j] = tmp;
            System.arraycopy(left, 0, sorted_list, 0, left.length);
            System.arraycopy(right, 0, sorted_list, left.length, right.length);
            i++;
            j++;
        }else{
            break;
        }
    return sorted_list;
}
int sort_list[]={5,9,7,8,3,4,5,6,1,0};
int[]left=新int[sort_list.length];
int[]right=newint[sort_list.length];
公共排序(){
int[]lv_排序列表=合并排序(排序列表);
for(int i=0;i1){
左=合并排序(Arrays.copyOfRange(iv_sort_list,0,iv_sort_list.length/2));
右=合并排序(Arrays.copyOfRange(iv_sort_list,iv_sort_list.length/2,iv_sort_list.length));
} 
int i=0;
int j=0;
int[]排序列表=新int[left.length+right.length];
而(i右[j]){
int tmp=左[i];
左[i]=右[j];
右[j]=tmp;
System.arraycopy(左,0,排序列表,0,左,长度);
System.arraycopy(右,0,排序列表,左.长度,右.长度);
i++;
j++;
}否则{
打破
}
返回排序后的列表;
}
现在我的问题是:

left=mergeSort(Arrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));
右=合并排序(Arrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length));

如果我尝试分配我的左/右数组“mergeSort(…)”,那么它将只分配一个具有新长度的新数组,该数组的每个位置都包含值0


非常感谢您的帮助:)

我认为您缺少递归函数中的基本情况
iv_sort_list.length=1
iv_sort_list.length=2
(取决于您的实现)

您的
left[]
right[]
应该在每个递归调用中声明?因为您经常使用那里的
length
属性,如果您声明为具有固定长度的全局属性,您将出错


另外,您的合并代码似乎有点凌乱,我已经修改了一点,现在应该可以工作了,请参见这里的示例:

非常感谢您的帮助和演示:)我将尝试理解它并通过我的own@Reptain没问题,如果你需要更多的帮助,请告诉我