有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。
基本思想:
将n个元素的数列分为已有序和无序两个部分,如
下所示:
{,{a2,a3,a4,…,an}}
{{a1(1),a2(1)},{a3(1),a4(1) …,an(1)}}
…
{{a1(n-1),a2(n-1),…}, {an(n-1)}}
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
算法的复杂度:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
java实现:
Java代码
- /**
- *插入排序,适用于少量数据的排序,时间复杂度O(n2),是稳定的排序算法,原地排序
- *
- *@parama
- */
- publicstaticvoidinsertSort(int[]a){
- intlength=a.length;
- for(inti=1;i<length;i++){
- inttemp=a[i];
- intj=i;
- for(;j>0&&a[j-1]>temp;j--){
- a[j]=a[j-1];
- }
- a[j]=temp;
- }
- }
分享到:
相关推荐
本篇文章将通过一组具体的数据集(8个整数)对直接插入排序(Direct Insertion Sort)和希尔排序(Shell Sort)这两种排序方法进行深入分析和比较。这两种排序算法在实际应用中都非常常见,各有优劣。 #### 二、...
本篇文章将详细介绍如何通过编写C语言程序实现直接插入排序,并输出每次排序后的结果,以便观察排序过程中的变化。 #### 二、直接插入排序的基本原理 直接插入排序的基本思想是:将待排序的序列看作是由一个已排序...
本篇文章将详细讲解两种经典的排序算法——插入排序和合并排序,并结合VC6.0(Visual C++ 6.0)这一经典开发环境,探讨如何在C++中实现这两种算法。 ### 插入排序 插入排序是一种简单直观的排序算法,它的工作原理...
本篇文章将详细讲解快速排序、冒泡排序和插入排序这三种常用的排序算法,并通过Java代码示例进行演示。 **快速排序** 快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare于1960年提出。其基本思想是...
本篇文章将深入探讨如何使用C语言来实现单链表的值插入排序。 首先,我们需要定义链表节点的结构体。在C语言中,这通常通过以下方式完成: ```c typedef struct Node { int data; // 节点存储的数据 struct Node...
本篇文章将详细介绍一个使用C语言编写的直接插入排序算法。直接插入排序是一种简单的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...
本篇文章将详细讲解标题中提到的六种常见排序算法的Java实现。 1. **冒泡排序**:冒泡排序是最基础的排序算法之一,它通过不断交换相邻的逆序元素来逐渐将较大的元素“浮”到数组的前端。在Java中,冒泡排序的基本...
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...
本篇文章将深入探讨几种常见的排序算法的C++实现,包括冒泡排序、选择排序、插入排序、快速排序、归并排序以及堆排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它通过重复遍历待排序的数列,依次比较...
插入排序是一种简单直观的比较排序算法,其工作原理类似于人们日常生活中整理书架的方式:每次从未排序的部分取出一个元素,通过与已排序部分的元素进行比较,找到适当的位置将其插入,从而逐步完成整个序列的排序。...
本篇文章将深入探讨并详细解析三种基本的排序算法:冒泡排序、插入排序以及选择排序,这三种算法均使用C语言实现。 ### 冒泡排序 冒泡排序是一种简单的比较排序算法,其基本思想是重复地走访过要排序的数列,一次...
本篇文章将深入探讨10种常见的内部排序算法,包括它们的基本思想、比较次数和移动次数的计算,以便更直观地理解不同算法的效率。 1. **直接插入排序**: 直接插入排序是一种简单的排序算法,它通过比较新元素与已...
在本篇文章中,我们将深入探讨直接插入排序的细节,包括它的基本思想、步骤、时间复杂度以及适用场景。 一、基本思想 直接插入排序的基本思想是将未排序的元素逐个与已排序的序列进行比较,找到合适的位置并插入,...
本篇文章将深入探讨四种基本的排序算法:冒泡排序、选择排序、插入排序以及希尔排序,并结合递归算法的复杂度进行分析。这些排序算法在不同的场景下有不同的效率表现,理解它们的原理和复杂度可以帮助我们更好地选择...
本篇文章将深入探讨九种常见的排序算法:冒泡排序、桶排序、计数排序、堆排序、插入排序、合并排序、快速排序、基数排序以及选择排序,并以C语言实现为例。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过...
本篇文章将深入探讨四种主流的排序算法:冒泡排序、选择排序、插入排序以及快速排序。 首先,我们来看冒泡排序。冒泡排序是最基础的排序算法之一,它的核心思想是通过反复遍历待排序的数据序列,每次比较两个相邻...
本篇文章将深入探讨五种常见的排序算法,并以Java编程语言为实现背景。这些算法包括冒泡排序、插入排序、选择排序、归并排序以及快速排序。 **冒泡排序**是一种基础的排序方法,它通过重复遍历数组,比较相邻元素并...
本篇文章将深入探讨几种常见的排序算法:直接插入排序、选择排序、冒泡排序以及堆排序,并给出它们的具体代码实现。 #### 直接插入排序 **基本思想**:直接插入排序的基本思想是将一个记录插入到已排序好的有序表...
这篇博客文章(虽然链接无法直接访问,但我们可以根据常规知识来解释这个概念)可能探讨了如何实现Hadoop MapReduce任务中的二次排序,并将其结果插入到数据库中。 **一、Hadoop二次排序** 在Hadoop MapReduce的...