Java 直接插入排序的三种实现

Java 直接插入排序的三种实现

本文将介绍 Java 中直接插入排序的三种实现方式,分别为插入排序、希尔排序和折半插入排序。

插入排序

插入排序是一种简单直观的排序算法,其基本思想是将一个待排序的元素插入到已排好序列中的适当位置。

以下是 Java 中插入排序的实现代码:

public static void insertSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int temp = arr[i];
        int j = i;
        while (j > 0 && arr[j-1] > temp) {
            arr[j] = arr[j-1];
            j--;
        }
        arr[j] = temp;
    }
}

上述实现中,使用一个外层循环遍历待排序数组,从第二个元素开始到最后一个元素。在内层循环中以正确的顺序将当前元素插入到已排好序的序列中。

以下是一个使用插入排序的示例:

int[] arr = {5, 3, 8, 6, 4};
insertSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为:

[3, 4, 5, 6, 8]

希尔排序

希尔排序是一种基于插入排序的优化算法,它通过将待排序数组分成若干个子序列进行插入排序来加快排序速度。

以下是 Java 中希尔排序的实现代码:

public static void shellSort(int[] arr) {
    int gap = arr.length / 2;
    while (gap > 0) {
        for (int i = gap; i < arr.length; i++) {
            int temp = arr[i];
            int j = i;
            while (j >= gap && arr[j-gap] > temp) {
                arr[j] = arr[j-gap];
                j -= gap;
            }
            arr[j] = temp;
        }
        gap /= 2;
    }
}

上述实现中,首先定义希尔增量 gap 为数组长度的一半,然后在外层循环中不断将 gap 减半,内层循环采用插入排序的方式对每个子序列进行排序。

以下是一个使用希尔排序的示例:

int[] arr = {5, 3, 8, 6, 4};
shellSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为:

[3, 4, 5, 6, 8]

折半插入排序

折半插入排序是一种对插入排序的优化算法,它通过将查找插入位置的线性搜索改为二分查找的方式来减少比较次数。

以下是 Java 中折半插入排序的实现代码:

public static void binaryInsertSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int temp = arr[i];
        int left = 0;
        int right = i-1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (arr[mid] > temp) {
                right = mid-1;
            } else {
                left = mid+1;
            }
        }
        for (int j = i-1; j >= left; j--) {
            arr[j+1] = arr[j];
        }
        arr[left] = temp;
    }
}

上述实现中,在内层循环中使用折半查找的方式找到待插入元素的位置。这里使用一个 left 指针指向待插入的位置,然后将 left 右侧的元素向右移动一位,最后将待插入元素插入到 left 的位置上。

以下是一个使用折半插入排序的示例:

int[] arr = {5, 3, 8, 6, 4};
binaryInsertSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为:

[3, 4, 5, 6, 8]

总结

本文介绍了 Java 中直接插入排序的三种实现方式,分别为插入排序、希尔排序和折半插入排序。不同的实现方式有着不同的优缺点,选择适合自己的算法是提高排序性能的重要步骤。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 直接插入排序的三种实现 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C#七大经典排序算法系列(下)

    《C#七大经典排序算法系列(下)》是一篇文章,通过介绍七种经典的排序算法,帮助读者更好地理解排序算法的原理和操作,并且让读者掌握这些算法的基本实现方法。本文将会细致地讲解每种算法的思路、时间复杂度以及使用场景,希望读者能在阅读后掌握七种排序算法的差异和选用方法。 文章包含七种排序算法,分别为:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序和希尔排序…

    算法与数据结构 2023年5月19日
    00
  • 归并排序时间复杂度过程推导详解

    归并排序时间复杂度过程推导详解 什么是归并排序 归并排序是一种基于分治思想的排序算法,将一个无序的数组划分成若干子数组,对每个子数组进行排序,然后再将排好序的子数组进行合并,最终得到一个完整有序的数组。 归并排序的时间复杂度 归并排序的时间复杂度是O(nlogn),其中n表示数组的长度。接下来我们将详细讲解归并排序的时间复杂度推导过程。 假设有一个长度为n的…

    算法与数据结构 2023年5月19日
    00
  • 利用C++的基本算法实现十个数排序

    利用C++的基本算法实现十个数排序 1. 算法选择 排序问题常见的算法有冒泡排序、插入排序、选择排序、快速排序等,它们的时间复杂度不尽相同,但在本题目的情况下,十个数的排序任何算法都可以。 为了方便,本文将使用最简单的冒泡排序算法。 2. 代码实现 冒泡排序算法的基本思路是从头到尾扫描一遍数组,比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们…

    算法与数据结构 2023年5月19日
    00
  • Python实现二维有序数组查找的方法

    首先,我们需要了解什么是二维有序数组。二维有序数组,也叫做二维矩阵,是一个含有 m 行 n 列的矩阵,每行每列都是有序的。在这个二维有序数组中,我们需要实现一个二分查找算法,用来查找某个目标值是否存在于这个矩阵中。 以下是步骤: 1. 将二维矩阵转换为一维数组 由于二维矩阵每一行每一列都是有序的,我们可以将二维矩阵看成一个一维数组,即将每一行连在上一行的后面…

    算法与数据结构 2023年5月19日
    00
  • PHP抽奖算法程序代码分享

    关于“PHP抽奖算法程序代码分享”的完整攻略,我将会从以下方面进行讲解: 什么是抽奖算法? 如何设计抽奖算法? 实现代码分享及示例说明 什么是抽奖算法? 抽奖算法是指通过一定的算法,实现在一些参与者中选出一个或几个”幸运儿”的过程。 如何设计抽奖算法? 抽奖算法设计的主要目的就是为了确保公平,同时符合某些要求。在比较公平的情况下,抽奖过程也应该是越来越具备娱…

    算法与数据结构 2023年5月19日
    00
  • php实现的常见排序算法汇总

    PHP实现的常见排序算法汇总 本文主要介绍几种PHP实现常见排序算法的方法,帮助读者快速了解和使用这些排序算法。 排序算法是计算机编程领域中非常重要的基础算法之一,可以用于对数据进行排序,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等,本文将介绍其中的三种算法。 冒泡排序 冒泡排序是一种简单直观的排序算法,通过比较相邻元素的大小,将较大的元素逐个…

    算法与数据结构 2023年5月19日
    00
  • PHP实现常见排序算法的示例代码

    让我来为你详细讲解“PHP实现常见排序算法的示例代码”的完整攻略。 什么是排序算法 排序算法是计算机科学中的基础算法之一,它将一组对象按照特定的顺序排列。排序算法一般都是以数字为例子,但是排序算法同样适用于字符串、日期、结构体等各种类型的数据。 常见的排序算法 常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。这里我们将为大家介绍冒泡排序…

    算法与数据结构 2023年5月19日
    00
  • 纯python实现机器学习之kNN算法示例

    首先我们需要清楚kNN算法的基本思想。kNN算法是一种基于实例的有监督学习算法,可以用于分类和回归问题。对于一个新的未标记数据,该算法会根据其与训练集中数据的距离,找到距离该点最近的k个点,然后根据这k个点的标签或者值来对该点进行分类或回归。 以下是具体实现步骤: 准备数据 kNN算法需要一个已经标记好的训练数据集。这里我们以Iris花卉数据集为例。我们先把…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部