这是插入排序的正确实现吗?

时间:2018-08-08 11:28:40

标签: java algorithm data-structures insertion-sort

您好,我已经用Java完成了插入排序,但是我不知道我是否正确实现了插入排序。有人可以合作吗? 我认为插入排序需要在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实现的插入排序。

1 个答案:

答案 0 :(得分:0)

假设在执行算法的多个步骤之后,对数组的部分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 > 0只能使用它。

现在,外循环只是将排序后的部分A[0..j[加上

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