使用插入排序

时间:2021-03-12 14:37:59

标签: java sorting arraylist insertion-sort

解决我的插入排序问题

这是我的代码...

        ArrayList<Integer> num2 = new ArrayList<Integer>();
        for (int b = 0; b < 300; b++)
        {
            num2.add((int)(Math.random() * 1000));
        }
        if (choice == 2)
        {
            System.out.println("Insertion Sort chosen\nUnsorted Array List: " + num2);
            insertionSort(num2);
            System.out.println("Insertion sorted Array List: " + num2);
        }//choice 2 end
public static void insertionSort(ArrayList<Integer> num2)
{
    for(int f = 1; f < num2.size(); f++)
    {
        int key = num2.get(f);
        for (int g = f-1; g >= 0; g--)
        {
            if (key < num2.get(g))
            {
                num2.set(g+1, num2.get(g));
                if (g == 0)
                {
                    num2.set(0, key);
                }
            }
            else
            {
                num2.set(g+1, key);
            }
        }
    }
}

输出:
选择插入排序
未排序数组列表:[42, 944, 500, 442, 277, 178, 881, 267, 705, 365, 481, 882, 221, 835, 329, 312, 97, 1,...
插入排序数组列表:[1, 479, 479, 479, 479, 718, 785, 785, 988, 988, 988, 988, 988, 988, 988, 988, 988,...
< >
如果有人能帮我弄清楚为什么一堆较大的数字会开始重复自己,因为这令人沮丧。

1 个答案:

答案 0 :(得分:0)

当你找不到问题所在时,你可以利用断点来帮助你。在您认为此处的代码至关重要的地方设置一个或多个断点。例如,当您调试 insertionSort 函数时,您可以在第 5 行设置断点以查看内部循环对数组所做的更改。而且你会发现内循环做了一些超出你预期的事情。然后可以继续在内循环里面设置断点,看看问题出在哪里。

实际上,您的问题是当您找到放置 key 的正确位置时,您应该打破内部循环。否则,由于 key 大于正确位置之前的所有数字,除第一个之外的所有数字(因为您的代码是 num2.set(g+1, key);,并且当 g = 0 时,它会更改第二个元素) 将替换为 key

因此,您只需要添加一个 break

public static void insertionSort(ArrayList<Integer> num2)
{
    for(int f = 1; f < num2.size(); f++)
    {
        int key = num2.get(f);
        for (int g = f-1; g >= 0; g--)
        {
            if (key < num2.get(g))
            {
                num2.set(g+1, num2.get(g));
                if (g == 0)
                {
                    num2.set(0, key);
                }
            }
            else
            {
                num2.set(g+1, key);
                break;
            }
        }
    }
}

相关问题