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日

相关文章

  • 七大经典排序算法图解

    “七大经典排序算法图解”攻略 简要介绍 “七大经典排序算法图解”是一篇介绍常见排序算法的文章。通过对每个算法的思想、代码实现和性能分析进行详细讲解,帮助读者更好地理解和掌握排序算法。 算法列表 本文介绍的七个排序算法如下: 冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序 希尔排序 冒泡排序 冒泡排序是一种简单的排序算法,它基于交换相邻元素的思想。具…

    算法与数据结构 2023年5月19日
    00
  • C#实现希尔排序

    C#实现希尔排序攻略 简介 希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序(Diminishing Increment Sorting)。希尔排序首先将要排序的序列分成若干个子序列,分别进行插入排序,待子序列基本有序时,再对全体记录进行一次直接插入排序。其算法主要思想是将原序列按一定间隔分为若干子序列,对每个子序列分别进行插入排…

    算法与数据结构 2023年5月19日
    00
  • c#实现最简洁的快速排序(你绝对可以看懂)

    下面我将详细讲解“c#实现最简洁的快速排序(你绝对可以看懂)”的完整攻略。 1、什么是快速排序? 快速排序是一种常用的排序算法,其思想是将一个数组划分为两个子数组,然后分别对这两个子数组进行排序。通过不断地递归调用这个过程,最终得到有序的数组。 2、快速排序的步骤 下面是快速排序的步骤: 选择一个基准值(pivot),一般选择数组中的第一个元素。 定义两个指…

    算法与数据结构 2023年5月19日
    00
  • JS中数据结构与算法—排序算法(Sort Algorithm)实例详解

    以下是关于“JS中数据结构与算法—排序算法(Sort Algorithm)实例详解”的完整攻略。 简介 数学中有一种重要的问题是如何将一组数据按照一定的规则有序排列。排序算法(Sort Algorithm)就是解决这种问题的一种算法。 在JS中,包含了许多排序算法的实现,包括:冒泡排序、选择排序、插入排序、快速排序、归并排序等。了解和掌握这些算法,有助于…

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

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

    算法与数据结构 2023年5月19日
    00
  • C语言深入探究直接插入排序与希尔排序使用案例讲解

    C语言深入探究直接插入排序与希尔排序使用案例讲解 直接插入排序 算法描述 直接插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。具体算法流程如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排…

    算法与数据结构 2023年5月19日
    00
  • CSS规则层叠时的优先级算法

    当多个CSS规则(指选择器和声明的组合)作用于同一元素时,就会遇到规则层叠的问题,也就是优先级的问题。CSS规则层叠时的优先级算法主要分为以下4个级别: 元素样式或行内样式(Inline Style):元素样式指的是通过HTML元素的style属性定义的样式,行内样式(如在CSS中使用选择器设置)也具有同等优先级; ID选择器(ID Selector):指通…

    算法与数据结构 2023年5月19日
    00
  • C语言中的结构体快排算法

    C语言中的结构体快排算法 在C语言中,复杂的数据类型可以通过结构体定义。结构体是一种自定义类型,可以由不同类型的变量组成。快速排序算法是一种高效的排序算法,通过十分巧妙的算法思想,可以在平均$O(nlogn)$的时间复杂度内完成数组的排序。对于结构体类型的排序,在快速排序算法中也可以使用。本文主要讲解如何在C语言中使用结构体进行快排排序。 快速排序算法 快速…

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