iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >插入排序/折半插入排序
  • 882
分享到

插入排序/折半插入排序

排序算法算法java 2023-10-07 13:10:12 882人浏览 薄情痞子
摘要

插入排序/折半插入排序 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

插入排序/折半插入排序

插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需要要用道O(1)的额外空间的排序),因而从后向前扫描过成功,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

概述

Insertion Sort和打扑克牌时,从牌桌上逐一拿起扑克牌,在手上排序的过程相同。

举例:

输入: {5 2 4 6 1 3}。

首先拿起第一张牌, 手上有 {5}。

拿起第二张牌 2, 把 2 insert 到手上的牌 {5}, 得到 {2 5}。

拿起第三张牌 4, 把 4 insert 到手上的牌 {2 5}, 得到 {2 4 5}。

以此类推。

动图演示

在这里插入图片描述

算法

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5
import java.util.Arrays;public class InsertionSort {// 插入排序算法,类似打扑克牌public static void main(String[] args) {int[] arrays = {5, 2, 4, 6, 1, 3};insertionSort(arrays);}private static void insertionSort(int[] arrays) {for (int i = 1; i < arrays.length; i++) {// 为了保证空间复杂度不变,我需要利用arrays这个数组int temp = arrays[i];int j;for (j = i - 1; j >= 0 && temp < arrays[j]; j--) {arrays[j + 1] = arrays[j];}arrays[j+1]= temp;}System.out.println(Arrays.toString(arrays));}}

折半插入排序

折半插入排序(Binary Insertion Sort)是一种基于插入排序的排序算法。它的思想是将待排序的序列分为已排序区和未排序区,然后逐个将未排序区的元素插入到已排序区的适当位置,使整个序列保持有序。

算法的详细步骤如下:

  1. 假设待排序序列为arr,初始时将arr[0]作为已排序区,arr[1]到arr[n-1]作为未排序区,其中n是序列的长度。
  2. 从未排序区选择第一个元素arr[i](i从1开始),将其插入到已排序区的适当位置。
  3. 在已排序区使用折半查找(二分查找)找到arr[i]在已排序区的插入位置。
    • 首先,确定查找区间的左边界left为0,右边界right为i-1。
    • 然后,计算中间位置mid为(left + right) / 2。
    • 比较arr[i]与已排序区的中间元素arr[mid]的大小:
      • 如果arr[i]小于arr[mid],则插入位置在[left, mid-1]区间,令right = mid - 1。
      • 如果arr[i]大于等于arr[mid],则插入位置在[mid+1, right]区间,令left = mid + 1。
    • 重复上述步骤,直到left > right,找到插入位置。
  4. 将已排序区中插入位置后的元素都向后移动一个位置,为arr[i]腾出空间。
  5. 将arr[i]插入到找到的插入位置,完成一次插入操作。
  6. 重复步骤2到步骤5,直到所有元素都被插入到已排序区。
public static void binaryInsertionSort(int nums[]) {for (int i = 1; i < nums.length; i++) {int low = 0;int high = i - 1;int temp = nums[i];while (high >= low) {int mid = (high + low) / 2;if (nums[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}for (int j = i; j > low; j--) {nums[j] = nums[j - 1];}nums[low] = temp;}}

折半插入排序的核心思想是利用二分查找来确定插入位置,从而减少比较次数,提高排序效率。相比于普通插入排序,折半插入排序的主要优势在于减少了比较的次数,尤其适用于大规模数据的排序。

折半插入排序的时间复杂度为O(n^2),与普通插入排序相同,但由于减少了比较次数,实际上的运行时间可能会比普通插入排序稍微快一些。它是一种稳定的排序算法,适用于小规模和部分有序的序列。

总结起来,折半插入排序是一种基于插入排序的排序算法,通过利用二分查找确定插入位置,减少比较次数,提高排序效率。它的时间复杂度为O(n^2),是一种稳定的排序算法,适用于小规模和部分有序的序列。

来源地址:https://blog.csdn.net/Tanganling/article/details/133636369

您可能感兴趣的文档:

--结束END--

本文标题: 插入排序/折半插入排序

本文链接: https://www.lsjlt.com/news/424463.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 插入排序/折半插入排序
    插入排序/折半插入排序 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入...
    99+
    2023-10-07
    排序算法 算法 java
  • Java折半插入排序怎么实现
    这篇文章主要讲解了“Java折半插入排序怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java折半插入排序怎么实现”吧!插入排序思想介绍折半插入排序与直接插入排序算法原理相同。只是,...
    99+
    2023-06-02
  • Java实现直接插入排序与折半插入排序的示例详解
    目录1.直接插入排序2. 折半插入排序1.直接插入排序 插入排序的基本思想: 主要分为两个区间, 无序区间和有序区间, 每次选择无序区间的第一个元素, 在有序区间内选择合适的位置进行...
    99+
    2024-04-02
  • 插入排序算法之希尔排序+直接插入排序
    目录希尔排序一、直接插入排序1. 单趟排序2. 直接插入排序二、希尔排序三、测试希尔排序和直接插入排序性能希尔排序 在介绍希尔排序之前,先了解一下直接插入排序 一、直接插入排序 1....
    99+
    2024-04-02
  • C语言常见排序算法之插入排序(直接插入排序,希尔排序)
    目录前言一、直接插入排序1.1 基本思想1.2 算法思想1.3 程序实现1.4 直接插入排序的总结二、希尔排序2.1 算法思想2.2 程序实现2.3 希尔排序的特征总结前言...
    99+
    2024-04-02
  • Java实现插入排序
    问题描述 利用插入排序把一列数组按从小到大或从大到小排序 (一)、插入排序思想 以从小到大为例: 1、第一轮插入,从第二个数开始,与前面的数依次比较,遇到比自己小的数,就插入到该数后...
    99+
    2024-04-02
  • C语言插入排序
    前言: 本文主要讲解插入排序中的直接插入排序和希尔排序。 1、直接插入排序: 1.1基本思想 直接插入排序是一种简单的插入排序法,其基本思想是把待排序的数值按照大小顺序逐个插入到一个已经排好序的有序序列中,直到将所有记录插入完为止,得到一个...
    99+
    2023-09-28
    c语言 排序算法 数据结构
  • Java中插入排序算法之希尔排序+直接插入排序的示例分析
    这篇文章给大家分享的是有关Java中插入排序算法之希尔排序+直接插入排序的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。希尔排序在介绍希尔排序之前,先了解一下直接插入排序一、直接插入排序1. 单趟排序x插...
    99+
    2023-06-25
  • 排序算法之插入排序法解析
    目录什么是插入排序法算法优化心得体会什么是插入排序法 插入排序法是一种简单但有效的排序算法,其基本思想是将一个待排序的元素逐个插入到已经排好序的元素序列中,直至所有元素都被插入完成,...
    99+
    2023-08-08
    排序算法 插入排序法
  • 排序算法图解之Java插入排序
    目录1.插入排序简介2.插入排序思想及图解3.插入排序代码实现1.插入排序简介 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序...
    99+
    2022-11-13
    Java 插入排序算法 Java插入排序 Java 排序算法
  • Java实现插入排序,希尔排序和归并排序
    目录插入排序算法步骤动图演示JavaScript代码实现Python代码实现Go代码实现Java代码实现希尔排序算法步骤JavaScript代码实现python代码实现Go代码实现J...
    99+
    2022-12-22
    Java插入排序 Java希尔排序 Java归并排序 Java排序
  • C#算法之冒泡排序、插入排序、选择排序
    冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序。 以从小到大排序为例。 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 1...
    99+
    2024-04-02
  • JAVA小练习冒泡排序,选择排序和插入排序
    冒泡:点击(此处)折叠或打开...
    99+
    2023-06-02
  • JAVA十大排序算法之插入排序详解
    目录插入排序代码实现动图演示代码实现时间复杂度算法稳定性总结插入排序 当我们在玩扑克牌的时候,总是在牌堆里面抽取最顶部的一张然后按顺序在手中排列。 插入排序是指在待排序的元素中,假设...
    99+
    2024-04-02
  • Java 十大排序算法之插入排序刨析
    目录插入排序原理插入排序API设计插入排序代码实现插入排序的时间复杂度分析插入排序原理 ①把所有元素分成已排序和未排序两组 ②找到未排序组的第一个元素,向已经排序的组中进行插入 ③倒...
    99+
    2024-04-02
  • C#实现冒泡排序和插入排序算法
    1.选择排序(冒泡排序) 升序 用第一个元素跟其他元素比较,如果该元素比其他元素,则交换,保证该元素是最小的。然后再用第二个元素跟后面其他的比较,保证第二个元素是除第一个最小的。依次...
    99+
    2024-04-02
  • Java插入排序举例分析
    本篇内容主要讲解“Java插入排序举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java插入排序举例分析”吧!插入排序原理①把所有元素分成已排序和未排序两组②找到未排序组的第一个元素,向...
    99+
    2023-06-25
  • TypeScript十大排序算法插入排序怎么实现
    今天小编给大家分享一下TypeScript十大排序算法插入排序怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一. 插...
    99+
    2023-07-05
  • Java数据结构之插入排序与希尔排序
    目录 一、正文1.排序的概念及其运用1.1排序的概念1.2排序运用1.3常见的排序算法2.插入排序算法的实现2.1插入排序二、测试代码三、结语 一、正文 1.排序...
    99+
    2023-05-14
    Java数据结构插入排序与希尔排序 数据结构插入排序 数据结构希尔排序
  • python中怎么实现冒泡排序和插入排序
    本篇文章给大家分享的是有关python中怎么实现冒泡排序和插入排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  1、冒泡排序  冒泡排序的主要思想类似于水底的气泡,从水底向...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作