插入排序 – Java 和 C++ 中的算法示例

插入排序是一种排序算法,它从未排序的数组中创建一个项目的排序数组,一次一个项目。

在本文中,我们将看到该算法的工作原理以及如何在代码中应用它。

如何使用插入排序

考虑一个数字数组:7、3、10、4、1、11。这些数字不按任何顺序(升序或降序)排序/组织。使用插入排序算法,我们可以将它们从最小到最大数字排序。

原始数组将分为两个 - 排序数组和未排序数组。然后,我们将从未排序的数组中选择数字,并将它们放在正确的位置。

当从未排序的数组中选取一个数字时,我们开始从已排序数组的后部进行排序。如果选取的数字小于已排序数组中的最后一个数字,则最后一个数字将向右移动,所选数字将占据其位置。迭代将继续,直到所选数字到达要与之比较的下一个数字不大于它的位置。

这可能看起来很多信息,但通过示例,您将更好地理解:

这是我们的数字数组:7,3,10,4,1,11

我们将此数组一分为二 - 排序数组和未排序数组。喜欢这个:

默认情况下,我们将第一个数字放在排序部分中,因为我们将开始与它进行比较。

那么,我们如何对这个数组进行排序呢?

未排序数组中的第一个数字是 3,因此它将成为所选数字。当我们将 3 移动到排序的数组时,那里的数字是 7。由于 7 大于 3,因此它将向右移动,然后 3 将占据其位置。

数组现在将如下所示:

对于 10,我们从后面开始与排序数组进行比较,后部的第一个数字是 7。由于 7 小于 10,因此不需要位置偏移,因此 10 将直接停留在 7 之后。

现在看看每边数字的当前位置:

您可能会对这些数字在排序区域上移动时如何更改其位置感到有些困惑。让我们在下一个示例中演示这一点。

要排序的下一个数字是 4。

以下是我们排序的数组目前的样子:3、7、10。

现在要排序的当前数字是 4。因此,从后方重新开始,我们比较4和10。10 大于 4,因此它会向右移动一个空格,并为四个空格创建一个空空间。像这样:3,7,?,10。

问号是创建的空间。但是我们还不能插入4;我们必须将其与下一个数字7进行比较。将创建另一个空格,因为 7 大于 4,我们的数组将如下所示:3,?,7,10。

下一个数字是 3。我们已经到了这样的地步,即要比较的数字小于我们从未排序数组中选择的当前数字。由于 3 小于 4,因此 4 将插入到最后创建的空间中。我们的排序数组现在将如下所示:3、4、7、10。

对于1,如果您已经理解了最后一个示例,那么应该很容易解决它。您应该尝试自己排序并插入最后两个数字。

提醒一下,如果未排序数组中的当前数字小于排序数组中要与之进行比较的任何数字,则已排序数组中的数字将向右移动,并在其先前位置创建一个空白区域以插入当前数字。

这将持续到当前数字达到大于要与之比较的数字的位置。此时,将当前数字插入到上次创建的空间中。

完成后,数组将如下所示:1、3、4、7、10、11。

让我们看一些代码示例!

Java 中的插入排序示例

如果我们想用代码做到这一点,下面是这样的:

public class InsertionSort {

    void sortArray(int arr[])
    {
        int n = arr.length;
        for (int i = 1; i < n; i++) {
            int current = arr[i];
            int j = i - 1;

            while (j >= 0 && arr[j] > current) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = current;
        }
    }

    static void printArray(int arr[])
    {
        int n = arr.length;
        for (int i = 0; i < n; i++)
            System.out.print(arr[i] + " ");

        System.out.println();
    }

    public static void main(String args[])
    {
        int arr[] = { 7, 3, 10, 4, 1, 11 };

        InsertionSort arrayOfNumbers = new InsertionSort();
        arrayOfNumbers.sortArray(arr);

        printArray(arr);

        // prints 1 3 4 7 10 11
    }
} 

让我们分解一下代码。

void sortArray(int arr[])
    {
        int n = arr.length;
        for (int i = 1; i < n; i++) {
            int current = arr[i];
            int j = i - 1;

            while (j >= 0 && arr[j] > current) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = current;
        }
    }

在上面,我们创建了一个用于对数组进行排序的函数。它将数组数据类型作为参数。然后,我们将数组长度存储在一个名为 . n

在我们的循环中,您可能会注意到变量为 1。您可能习惯于将其视为循环中的 0。此处为 1,因为我们从数组中的第二个值开始排序。 i

变量是正在排序的当前值。用于通过减小变量的值来向左移动变量的位置。 current j current

接下来的 while 循环有助于我们通过提供的条件检查何时停止降低变量的位置。 current

当满足这些条件时,当前值将插入到正确的位置。这与我们在上一节中看到的示例相同。

static void printArray(int arr[])
    {
        int n = arr.length;
        for (int i = 0; i < n; i++)
            System.out.print(arr[i] + " ");

        System.out.println();
    }

上面的代码只是一个用于打印数组值的函数。

public static void main(String args[])
    {
        int arr[] = { 7, 3, 10, 4, 1, 11 };

        InsertionSort arrayOfNumbers = new InsertionSort();
        arrayOfNumbers.sortArray(arr);

        printArray(arr);

        // prints 1 3 4 7 10 11
    }

现在,我们使用它来对数组进行排序,然后使用已创建的函数打印值。

C++中的插入排序示例

#include <bits/stdc++.h>
using namespace std;

void insertionSort(int arr[], int n)
{
    int i, current, j;
    for (i = 1; i < n; i++)
    {
        current = arr[i];
        j = i - 1;

        while (j >= 0 && arr[j] > current)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = current;
    }
}

void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
}

int main()
{
    int arrayOfNumbers[] = { 7, 3, 10, 4, 1, 11 };
    int n = sizeof(arrayOfNumbers) / sizeof(arrayOfNumbers[0]);

    insertionSort(arrayOfNumbers, n);
    printArray(arrayOfNumbers, n); // 1 3 4 7 10 11 

    return 0;
}

此代码与我们在上一节中使用的代码相同。唯一的区别是,我们在本节中编写了它,C++。因此,您可以查看上一节中给出的解释,以便更好地理解。

结论

在本文中,我们了解了插入排序算法如何与一些示例一起使用,以及如何在 Java 和C++代码中应用它。

祝您编码愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

库特社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值