Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的合并排序代码有什么问题?_Java_Algorithm_Sorting - Fatal编程技术网

Java 我的合并排序代码有什么问题?

Java 我的合并排序代码有什么问题?,java,algorithm,sorting,Java,Algorithm,Sorting,只是写一些基本的mergeSort代码,我不知道我的逻辑是否有问题。对我来说,它应该很好用 因此,理想情况下,它应该按排序顺序打印元素:1 2 8 11 17 19 25 50 但显示的输出是:82111719192550 我不明白这个代码有什么问题。我的逻辑有问题吗 如果有人能帮我,那就太好了。 对不起,如果这是一个非常愚蠢的问题在这里问 public class MergeSort { static final int arr[] = {8, 2, 19, 25, 11, 1, 17

只是写一些基本的mergeSort代码,我不知道我的逻辑是否有问题。对我来说,它应该很好用

因此,理想情况下,它应该按排序顺序打印元素:1 2 8 11 17 19 25 50

但显示的输出是:82111719192550

我不明白这个代码有什么问题。我的逻辑有问题吗

如果有人能帮我,那就太好了。 对不起,如果这是一个非常愚蠢的问题在这里问

public class MergeSort
{
    static final int arr[] = {8, 2, 19, 25, 11, 1, 17, 50};
    static int sorted[] = new int[arr.length];
    public static void main(String args[])
    {
        mergeSort(0, arr.length - 1);
        
        display();
    }
    
    static void display()
    {
        for(int i=0; i<sorted.length; i++)
        {
            System.out.print(sorted[i] + " ");
        }
    }
    
    static void mergeSort(int first, int last)
    {
        if(first < last)
        {
            int mid = (first + last)/2;
            mergeSort(first, mid);
            mergeSort(mid + 1, last);
            merge(first, mid, last);
        }
    }
    
    static void merge(int first, int mid, int last)
    {
        int ansIndex = 0;
        int index1 = first;
        int index2 = mid + 1;
        
        while(index1 <= mid && index2 <= last)
            if(arr[index1] < arr[index2])
            {
                sorted[ansIndex] = arr[index1];
                index1++;
                ansIndex++;
            }
            else if(arr[index2] < arr[index1])
            {
                sorted[ansIndex] = arr[index2];
                index2++;
                ansIndex++;
            }
            else
            {
                sorted[ansIndex] = arr[index1];
                index1++; index2++; ansIndex++;
            }
        
        if(index1 <= mid)
            while(index1 <= mid)
            {
                sorted[ansIndex] = arr[index1];
                ansIndex++; index1++;
            }
        else if(index2 <= last)
            while(index2 <= last)
            {
                sorted[ansIndex] = arr[index2];
                index2++; ansIndex++;
            }
    }
}
公共类合并排序
{
静态final int arr[]={8,2,19,25,11,1,17,50};
静态整型排序[]=新整型[arr.length];
公共静态void main(字符串参数[])
{
合并排序(0,arr.length-1);
显示();
}
静态无效显示()
{

对于(int i=0;i您的错误是在每一步都使用相同的数组
arr
sorted
,而不复制数据

最简单的修正是将范围
0..ansIndex
sorted
复制到
arr
merge


另外,
display
应该显示
arr
sorted
只是临时缓冲区)

如果结果是错误的,那么是的,合并排序代码存在逻辑问题。你真的需要问我们吗?“我的逻辑有问题吗?”是的。还有什么你想知道的吗?网上有很多关于合并/排序算法的描述。你看过你的设计了吗?我还建议对所有
if
-和
while
-语句使用
{}
,以增加可读性和可追溯性。