【问题标题】:Is this the correct implementation of an insertion sort?这是插入排序的正确实现吗?
【发布时间】:2018-08-08 11:28:39
【问题描述】:

您好,我已经在 J​​ava 中进行了插入排序,但我不知道我是否正确实现了这一点。有人可以合作吗? 我认为插入排序需要在 for 循环中包含一个 while 循环 因此我实现了这个,但我不知道它是否正确。

// ------------------------------------------------------------

import java.lang.Math; // headers MUST be above the first class
import java.util.Arrays;

// one class needs to have a main() method
public class Insertionsort {
    // arguments are passed using the text field below this editor
    public static void main(String[] args) {
        // --------------------------------------------- insertion sort
        int mainInsersionSortArray[] = {64, 25, 12, 22, 11, 10, 9, 8, 7, 6, 5, 4, 3};
        int insertionSortTemporaryValue = 0;
        System.out.println("Array before insertion sort");
        for (int z = 0; z < mainInsersionSortArray.length; z++) {
            System.out.println(mainInsersionSortArray[z]);
        }

        int x1;
        for (int k0 = 1; k0 < mainInsersionSortArray.length; k0++) {
            x1 = k0;
            while (x1 != 0) {
                if (mainInsersionSortArray[x1] < mainInsersionSortArray[x1 - 1]) {
                    insertionSortTemporaryValue = mainInsersionSortArray[x1];
                    mainInsersionSortArray[x1] = mainInsersionSortArray[x1 - 1];
                    mainInsersionSortArray[x1 - 1] = insertionSortTemporaryValue;
                }
                x1 = x1 - 1;
            }
        }

        System.out.println("\n" + "Array after insertion sort");
        for (int z1 = 0; z1 < mainInsersionSortArray.length; z1++) {  // integerArray.lenght - looping through the whole array starting from i[0]
            System.out.println(mainInsersionSortArray[z1]);
        }
    }
}

在java中实现的插入排序。

【问题讨论】:

  • 首先,请格式化你的代码,那你为什么要问呢?它是否有效?如果没有,请提供示例输入预期输出以及实际输出
  • 恐怕你需要自己测试一下。 Stack Overflow 适用于具有足够详细信息以识别答案的特定问题。调试和测试不在 Stack Overflow 的范围内。
  • 另外,它更可能是 Bubblesort 而不是 Insertionsort 算法
  • 嗨,代码正在运行,并对数组进行排序,但是我不知道我是否进行了插入排序或其他排序(例如冒泡排序/选择排序)。 ?
  • @ekcs 您应该能够将您的代码与其他插入排序代码或您可以在线找到的插入排序可视化进行比较。如果您从逻辑上理解插入排序应该做什么,您应该能够判断这是否是您的代码正在做的事情(如果您正在编写您不理解的代码,您会遇到更大的问题)。

标签: java algorithm data-structures insertion-sort


【解决方案1】:

假设经过若干步算法,数组的A[0:k[部分(即k除外)被排序。在下一步中,我们考虑元素A[k],搜索它的插入位置并将所有元素移到该位置之后。最好通过保留A[k] 的副本,移动较大的元素并将复制的元素放在正确的位置来一次完成。为避免缓冲区溢出,搜索应在索引 0 处停止。

内部循环读取

int Save= A[k];
for ( ; k >= 0 && A[k-1] > Save; k--) // Loop until you can insert
{
    A[k]= A[k-1]; // Shift
}
A[k]= Save;

如果A[k] 已经在正确的位置,则更好的变体可以避免不必要的复制:

if (A[k] <= A[k-1])
{
    int Save= A[k];
    A[k]= A[k-1]; // Shift
    for (k--; k >= 0 && A[k-1] > Save; k--) // Loop until you can insert
    {
        A[k]= A[k-1]; // Shift
    }
    A[k]= Save;
}

请注意,它只能用于提供k &gt; 0

现在外部循环只是增加了排序部分A[0..j[

for (j= 1; j < n; j++)
{
    k= j;
    "Inner loop"
}

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多