【问题标题】:Insertion Sort output is not as expected插入排序输出不如预期
【发布时间】:2017-04-26 01:24:23
【问题描述】:

我的插入排序输出不正确。当我尝试调用insertionSort方法时,返回的数组没有排序

break 语句的使用是否正确?

public int[] insertionSort(int [] arr){
    for(int i=1;i<arr.length;i++){
        for(int j=0;j<=i-1;){
            int temp;
            if(arr[i] < arr[j]){
                temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; 
                break;
            }
            else j++;
            }
        }
        return arr;
}

int [] array = {10,5,6,7,1,9,3,8}调用方法,但结果不正确:

排序后的输出: 1, 3, 7, 8, 5, 10, 6, 9, // 输出没有排序,但略有变化

【问题讨论】:

  • 请尝试搜索插入排序的正确java实现并与您的进行比较以找出问题
  • 你为什么要打破 if 语句?
  • 如果里面发生了什么,你能解释一下吗?
  • 你正在打破内部循环,因此退出它。查看维基百科上的伪代码。没有任何东西会从循环中中断。 en.m.wikipedia.org/wiki/Insertion_sort

标签: java arrays sorting break insertion-sort


【解决方案1】:

这是有效的代码:

public static int[] insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                // Swap
                int tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;

                j--;
            }
        }
        return arr;
    }

您的代码的一个问题是您会将i-th 元素放在正确的位置,但可能会弄乱已经在正确位置的元素的位置。

插入排序的思想是在正确的位置插入i-th元素,这意味着你必须将所有元素向右移动。但是,在您的情况下,您只需在找到正确位置后交换 j-th 元素和 i-th

例子: 1 3 5 8 10这是数组的当前状态 现在你尝试插入元素6,你发现正确的位置是3,所以你交换它们,结果是: 1 3 5 6 10 8 弄乱了号码 8 的位置。

【讨论】:

  • 感谢您的支持,
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多