ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 为什么这个合并排序实现不起作用?

2019-07-04 14:49:05  阅读:163  来源: 互联网

标签:java sorting mergesort


以下是我对合并排序的实现.

private static void mergeSort(int[] a, int low , int high,int[] res)
{
    int mid = (low + high)  /2;
    if (low  < high)
    {
        mergeSort(a,low,mid-1,res);
        mergeSort(a,mid,high-1,res);
        merge(a,low,mid,high,res);

    }
}



   private static void merge(int[] a, int low , int mid , int high,int[] res)
{

    int i = low;
    int j = mid ;

    int k =0;

    while (i < mid && j < high)
        if(a[i] < a[j])
               res[k++] = a[i++];
        else
              res[k++] = a[j++];


    while(i < mid)
        res[k++] = a[i++];

    while(j < high)
        res[k++] =a[j++];
}

当我在main方法中运行这个程序时,我打印出原始数组.不确定是什么问题.虽然我单独测试时合并方法有效.

public static void main(String[] args)
{
    int[] a = {45,24,53,13,54,45,63,23};
    int[] res = new int[a.length];
    mergeSort(a,0,a.length,res);
    for(int i=0 ; i < res.length ; i++)
    {
       System.out.print(res[i] +",");
    }
}

输出:

 45,24,53,13,54,45,63,23,

我花了很多时间寻找问题.我无法解决它.

解决方法:

答案是@Mysticial sais,除了需要在merge方法中复制数组:

private static void mergeSort(int[] a, int low , int high,int[] res)
{
    int mid = (low + high)  /2;
    if (low + 1 < high)
    {
        //  Sort sub-parts
        mergeSort(a,low,mid,res);
        mergeSort(a,mid,high,res);

        //  Merge back to "res"
        merge(a,low,mid,high,res);
    }else{
        res[low] = a[low];
    }
}

private static void merge(int[] a, int low , int mid , int high,int[] res)
{

    int i = low;
    int j = mid;

    int k = low;   //  Use "low" instead of 0.

    while (i < mid && j < high)
        if(a[i] < a[j])
               res[k++] = a[i++];
        else
              res[k++] = a[j++];


    while(i < mid)
        res[k++] = a[i++];

    while(j < high)
        res[k++] =a[j++];

    //  Copy back to "a"
        for (int c = low; c < high; c++){
            a[c] = res[c];
        }

}

无论如何,请注意这样做会覆盖原始数组……因此您可能希望将调用包装为mergeSort以避免它:

private static int[] mergeSort(int[] a){
    int[] b = new int[a.length];
    int[] tmp = new int[a.length];
    System.arraycopy(a, 0, b, 0, a.length);
    mergeSort(b, 0, b.length, tmp);
    return b;
}

public static void main(String[] args) {
    int[] a = {45, 24, 53, 13, 54, 45, 63, 23};
    int[] res = mergeSort(a);
    for (int i = 0; i < res.length; i++) {
        System.out.print(res[i] + ",");
    }
}

希望这可以帮助!

标签:java,sorting,mergesort
来源: https://codeday.me/bug/20190704/1378179.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有