Java 合并排序将重复数据添加到数组中

Java 合并排序将重复数据添加到数组中,java,arrays,sorting,merge,Java,Arrays,Sorting,Merge,我正在使用Java尝试使用合并排序对对象的价格进行排序。我已经在另一段代码中使用了合并排序,这段代码运行得非常好,我使用该模型为我正在处理的另一个项目开发了一个合并排序。但是,当我运行程序时,它不会输出数组中的所有项,并最终复制了一些项 TestItem.java public static void sortPrice(Item[] it, int low, int high) { if (low == high) { return; } int mid

我正在使用Java尝试使用合并排序对对象的价格进行排序。我已经在另一段代码中使用了合并排序,这段代码运行得非常好,我使用该模型为我正在处理的另一个项目开发了一个合并排序。但是,当我运行程序时,它不会输出数组中的所有项,并最终复制了一些项

TestItem.java

public static void sortPrice(Item[] it, int low, int high) {
    if (low == high) {
        return;
    }
    int middle = (low + high)/2;
    sortPrice(it, low, middle);
    sortPrice(it, middle + 1, high);
    merge(it, low, middle, high);
}

public static void merge(Item[] it, int l, int m, int h) {
    System.out.println(h-l+1);
    Item[] tmpItem = new Item[h - l + 1];
    int index = 0;
    int i = l, j = m + 1;
    while (i <= m || j <= h) {
        System.out.println(m);
        if (i > m) {
            tmpItem[index] = it[j];
            j++;
        } else if (j > h) {
            tmpItem[index] = it[i];
            i++;
        } else if (it[i].getPrice() > it[j].getPrice()) {
            tmpItem[index] = it[i];
            i++;
        } else {
            tmpItem[index] = it[j];
            j++;
        } 
        index++;
    }
    for (int k = l; k <= h; k++) {
        it[k] = it[k - l];
    }
}
实际产量:

1201: Wrench Sets  Quantity Available: 55  Price: $80.0
1034: Door Knobs   Quantity Available: 60  Price: $21.5
1600: Levels       Quantity Available: 80  Price: $19.99
1201: Wrench Sets  Quantity Available: 55  Price: $80.0
1034: Door Knobs   Quantity Available: 60  Price: $21.5
1600: Levels       Quantity Available: 80  Price: $19.99
项目在Item.java中声明

public static void sortPrice(Item[] it, int low, int high) {
    if (low == high) {
        return;
    }
    int middle = (low + high)/2;
    sortPrice(it, low, middle);
    sortPrice(it, middle + 1, high);
    merge(it, low, middle, high);
}

public static void merge(Item[] it, int l, int m, int h) {
    System.out.println(h-l+1);
    Item[] tmpItem = new Item[h - l + 1];
    int index = 0;
    int i = l, j = m + 1;
    while (i <= m || j <= h) {
        System.out.println(m);
        if (i > m) {
            tmpItem[index] = it[j];
            j++;
        } else if (j > h) {
            tmpItem[index] = it[i];
            i++;
        } else if (it[i].getPrice() > it[j].getPrice()) {
            tmpItem[index] = it[i];
            i++;
        } else {
            tmpItem[index] = it[j];
            j++;
        } 
        index++;
    }
    for (int k = l; k <= h; k++) {
        it[k] = it[k - l];
    }
}

对不起,如果我犯了语法错误或造成混乱。我还在学习Java编程语言。谢谢你的帮助

代码从它[]合并到tempItem[],这样last for循环应该从tmpItem[]复制回它[]:

    index = 0;        
    for(i = l; i <= h; i++)
        it[i] = tempItem[index++];
index=0;

对于(i= l;i@ TiMyAythEJR.-这是一个简单的错误。您可能需要考虑调用代码中的TimeTeM[](size =高-低1)的一次分配,或者调用一个以TEMPITEM[]作为参数的归并排序的内部版本的帮助函数。可以是分配tempItem的帮助函数,然后将其用作mergesortPrice(it、low、high、tempItem)的参数。但对于这么小的数组来说,这不是什么大问题。