【问题标题】:Java Program - Insertion sort using For Loop [closed]Java程序-使用For循环的插入排序[关闭]
【发布时间】:2019-05-12 07:39:29
【问题描述】:

我写了一个用于插入排序的java程序。

public class InsertionSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int arr[] = { 12, 11, 13, 5, 6 };

        int len = arr.length;

        for(int i=0;i<len-1;i++) {

            for(int j=i+1;j<len;j++) {

                if(arr[j] < arr[i]) {
                    int temp = arr[j];
                    arr[j] = arr[i];
                    arr[i] = temp;
                }
            }
        }
        for(int i=0;i<len;i++) {
            System.out.print(arr[i]+ " ");
        }

    }

}

请告诉我上述程序是否正确以及是否是执行插入排序的正确方法。我得到了正确的输出。

【问题讨论】:

  • 最好是使用不同的输入进行测试,以确保程序按预期工作。尝试使用一个空数组、一个元素的数组、两个元素(已排序和未排序以及两个相等的元素)、更多元素的数组。

标签: java arrays insertion-sort


【解决方案1】:

如果您尝试在 j 循环的每次迭代后打印 New 数组,使用

System.out.println(Arrays.toString(arr))

这将导致以下带有分析的语句作为注释 //插入排序从索引1的元素开始,因为它比较数字的左侧
每次排序后,当前值左侧的所有元素都将在之前的迭代中已经排序

[11, 12, 13, 5, 6] // correct since 11 < 12
[11, 12, 13, 5, 6] //correct since 12 < 13
[5, 12, 13, 11, 6] //5 has changed its position which is correct but also Here you can //see the position of 11 changed
[5, 12, 13, 11, 6]
[5, 12, 13, 11, 6]
[5, 11, 13, 12, 6] 
[5, 6, 13, 12, 11] 
[5, 6, 12, 13, 11]
[5, 6, 11, 13, 12]
[5, 6, 11, 12, 13]

试试下面的代码

public static void main(String[] args)  {
        int arr[] = { 12, 11, 13, 5, 6 };
        int len = arr.length;
        for(int i=1; i<len; i++) {
            int key = arr[i];
            int j = i - 1;
            for ( ; (j >= 0 && arr[j] > key); j--) { 
                arr[j + 1] = arr[j];  
            } 
            arr[j + 1] = key;
            System.out.println(Arrays.toString(arr));
        }
    }

它会给你下面的输出

[11, 12, 13, 5, 6]
[11, 12, 13, 5, 6]
[5, 11, 12, 13, 6]
[5, 6, 11, 12, 13]

来源https://www.geeksforgeeks.org/insertion-sort/

【讨论】:

  • 感谢@hades 的详细解释。但是我们可以使用 for 循环而不是 while 来完成这项工作。或者它只会在一段时间的情况下工作,这是实现这一点的最佳方式。
  • 是的,我们可以..我会更新答案
  • @Kaustubh 我已经用 for 循环更新了答案,如果你觉得它对你有问题,请接受答案:)
  • 非常感谢!它有效:)
【解决方案2】:

这是正确的,但它不是插入排序。你写了冒泡排序。

插入排序如下:

public class InsertionSort {    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int arr[] = { 12, 11, 13, 5, 6 };
        int len = arr.length;
        for(int i=0;i<len-1;i++) {
            int max_idx = i
            for(int j=i+1;j<len;j++) {
                if(arr[max_idx] < arr[j]) {
                    max_idx = j
                }
            }

            if (i != max_idx) {
                int temp = arr[max_idx];
                arr[max_idx] = arr[i];
                arr[i] = temp;
            }
        }
        for(int i=0;i<len;i++) {
            System.out.print(arr[i]+ " ");
        }
    }
}

顺便说一下,Java 集合有自己的排序方法,速度更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2019-03-18
    • 2023-03-18
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多