java插入排序 Insert sort实例

下面我将详细讲解如何实现Java的插入排序算法。

插入排序 Insert Sort

插入排序是一种简单直观的排序算法,它的基本思想是将未排序的数据依次插入到已排序数据中的合适位置,使得插入后序列仍然有序。

插入排序的算法步骤如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

插入排序有两种实现方式,分别为直接插入排序和二分插入排序。下面我们来详细介绍这两种实现方式。

直接插入排序

直接插入排序是一种最简单的实现方式。它的核心思想是将未排序的元素依次插入到已排序的序列中的合适位置。

代码示例:

/**
 * 直接插入排序实现
 * @param array 待排序数组
 */
public static void insertSort(int[] array) {
    int i, j, temp;
    for (i = 1; i < array.length; i++) {
        temp = array[i];
        for (j = i - 1; j >= 0; j--) {
            if (array[j] > temp) {
                array[j + 1] = array[j];
            } else {
                break;
            }
        }
        array[j + 1] = temp;
    }
}

直接插入排序的时间复杂度为 $O(n^{2})$,空间复杂度为 $O(1)$。在实际应用中,直接插入排序在小规模数据的排序中性能表现较好,在数据量比较大的情况下表现较差。

二分插入排序

二分插入排序是直接插入排序的一种改进方式。它的核心思想是使用二分查找的策略来寻找待排序元素在已排序数组中的合适位置。

代码示例:

/**
 * 二分插入排序实现
 * @param array 待排序数组
 */
public static void binaryInsertSort(int[] array) {
    int i, j, left, right, mid, temp;
    for (i = 1; i < array.length; i++) {
        temp = array[i];
        left = 0;
        right = i - 1;
        while (left <= right) {
            mid = (left + right) / 2;
            if (temp < array[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        for (j = i - 1; j >= left; j--) {
            array[j + 1] = array[j];
        }
        array[left] = temp;
    }
}

二分插入排序的时间复杂度同样为 $O(n^{2})$,但是它的时间常数比直接插入排序略小。在实际应用中,二分插入排序在大规模数据的排序中性能表现较好。

示例说明

假设我们有一个整数数组,数组元素为 [3, 5, 1, 4, 2] ,如果我们使用直接插入排序算法进行排序,那么排序后的数组应该为 [1, 2, 3, 4, 5] 。下面是一个Java实现的示例:

public class InsertSortExample {
    public static void main(String[] args) {
        int[] array = {3, 5, 1, 4, 2};
        System.out.println("排序前:" + Arrays.toString(array));
        insertSort(array);
        System.out.println("排序后:" + Arrays.toString(array));
    }
}

如果我们使用二分插入排序算法进行排序,那么排序后的数组依然为 [1, 2, 3, 4, 5] 。下面是一个Java实现的示例:

public class BinaryInsertSortExample {
    public static void main(String[] args) {
        int[] array = {3, 5, 1, 4, 2};
        System.out.println("排序前:" + Arrays.toString(array));
        binaryInsertSort(array);
        System.out.println("排序后:" + Arrays.toString(array));
    }
}

以上就是关于Java插入排序的完整攻略及示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java插入排序 Insert sort实例 - Python技术站

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

相关文章

  • Go归并排序算法的实现方法

    Go归并排序算法的实现方法 简介 归并排序(Merge Sort)是一种经典的分治算法,它将一个大问题分解为若干个小问题,通过递归将小问题排好序,最后再将小问题合并起来,得到排序的结果。 归并排序的最坏时间复杂度为$ O(nlogn)$,且具有稳定性,是较为优秀的排序算法之一。 实现方法 归并排序的实现分为两个步骤,分别是分解和合并: 分解 分解过程需要递归…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • golang 归并排序,快速排序,堆排序的实现

    Golang 实现归并排序,快速排序和堆排序 简介 排序算法的实现是大多数程序员必备的技能之一。在这个过程中,我们考虑三种经典的排序算法之一:归并排序,快速排序和堆排序。我们在学习它们的同时,也在学习使用 Golang 写出高效的排序算法。 归并排序 算法原理 归并排序是基于归并操作的一种排序算法,该算法的核心思想是将一个数组分成两个较小的数组,然后递归地将…

    算法与数据结构 2023年5月19日
    00
  • 逐步讲解快速排序算法及C#版的实现示例

    逐步讲解快速排序算法及C#版的实现示例 1. 快速排序算法简介 快速排序算法是一种高效的排序算法,它的时间复杂度为 $O(nlogn)$。它的基本思想是通过一次划分将原问题分解为两个子问题,再对子问题进行递归解决,最终得到排序结果。 2. 快速排序算法核心思想 快速排序算法的核心思想是选取一个基准元素,将待排序的序列分成两部分,一部分比基准元素小,一部分比基…

    算法与数据结构 2023年5月19日
    00
  • 关于Python排序问题(冒泡/选择/插入)

    关于Python排序问题,一般包括冒泡排序、选择排序和插入排序。下面分别进行介绍。 冒泡排序 冒泡排序就是重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复地进行以上操作,直到没有可以交换的元素为止。 示例代码: def bubble_sort(arr): n = len(arr) for i in range(n-1): …

    算法与数据结构 2023年5月19日
    00
  • JavaScript中几种排序算法的简单实现

    JavaScript中几种排序算法的简单实现 排序算法在计算机科学中是一个基本问题。不同的排序算法具有不同的时间和空间复杂度,选择合适的排序算法可以提高程序的效率。本文介绍了JavaScript中几种排序算法的简单实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。 冒泡排序 冒泡排序是最简单的排序算法之一。它重复遍历列表,比较相邻的元素,并交换它们…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现经典排序算法之冒泡排序

    JavaScript实现经典排序算法之冒泡排序 什么是冒泡排序? 冒泡排序是一种简单的排序算法,从序列左侧开始比较两个相邻的元素,如果顺序不对就交换位置,直到序列末尾,这样一次遍历后,序列最后一个元素就是当前序列最大值。然后对剩余序列重复上述过程,直到整个序列有序。 算法实现 我们来看看如何用JavaScript实现冒泡排序。 function bubble…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第六天 五大经典查找【下】

    算法系列15天速成 第六天 五大经典查找【下】- 完整攻略 简介 本篇文章是算法系列15天速成中的第六天内容,主要是介绍五大经典查找的后三种查找算法:插值查找、斐波那契查找以及分块查找。在介绍每一种查找算法时都会包含具体的思路、复杂度和应用场景等内容。 插值查找 思路 插值查找是在二分查找的基础上优化的一种查找算法,它不是通过数组的中间元素进行查找,而是通过…

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