加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 了解合并排序的工作原理

发布时间:2020-12-15 01:03:01 所属栏目:Java 来源:网络整理
导读:private void merge(int[] array,int[] aux,int low,int mid,int hi) { int i = low,j = mid + 1,k; for (k = low; k 代码有效,但我很难理解它. 我理解的目的 if (hi 但我不知道返回执行后会发生什么. 我不明白为什么合并函数中的最后一个存在.如果算法分裂

private void merge(int[] array,int[] aux,int low,int mid,int hi) {
    int i = low,j = mid + 1,k;

    for (k = low; k <= hi; k++) {
        aux[k] = array[k];
    }
    for (k = low; k <= hi; k++) {
        if (i > mid) {
            array[k] = aux[j++];
        } else if (j > hi) {
            array[k] = aux[i++];
        } else if (aux[j] <  aux[i]) {
            array[k] = aux[j++];
        } else /* if (aux[i] <= aux[j] */ {
            array[k] = aux[i++];
        }
    }
}

private void sort(int[] array,int lo,int hi) {   
    if (hi <= lo) {
        return;
    }

    int mid = lo + (hi - lo) / 2;
    sort(array,aux,lo,mid);
    sort(array,mid + 1,hi);
    merge(array,mid,hi);
}

public void mergeSort() {      
    int aux[] = new int[n];
    sort(ar,n - 1);
}

代码有效,但我很难理解它.

>我理解的目的

if (hi <= lo) {
    return;
}

但我不知道返回执行后会发生什么.
>我不明白为什么合并函数中的最后一个存在.如果算法分裂直到aux为[3,5]并且我想要升序排序,则else if将比较5< 3将跳转到else,它应该交换2个值.
编辑:我使用调试器进行了一些操作,对于此示例(3 33 1 55 66 34 67 45 23),它使用前2个值到达合并功能.最后的其他如果比较33< 3并输入最后一个.如果这些值的顺序正确,这行代码的重点是什么?在数组[k] = aux [i]之后;执行时,array [0]的值与奇数相同,因为aux [i]是数组[1]

最佳答案
>在排序方法中,问题分为较小的子问题.当要排序的范围只有一个或零宽时,无需执行任何操作,并且可以关闭该方法.这是因为单独的一个元素按定义排序.它是递归like m0skit0 said的停止条件.
>此算法中不会交换元素.该方法尝试合并两个排序的数组.有两个指数i和j.当我到达中间时,右侧部分中的所有元素都将添加到结果数组中.如果j到达右边界,则左侧部分的所有元素都将添加到结果中.这是前两个案例.
现在在最后两种情况下,算法试图找出由i和j索引的当前元素中的哪一个是最小值并将其添加到结果数组中.在第三种情况下,j处的元素较小并添加到结果数组中.在第四种情况下,选择i处的元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读