`
Riddick
  • 浏览: 640313 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

常用排序算法实现之插入排序(Insertion Sort)

阅读更多

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

算法描述

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

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

 

示例代码

 

void InsertSort(int array[], int length)
{
    int i, j, key;

    for (i = 1; i < length; i++)
    {
        key = array[i];
        // 把i之前大于array[i]的数据向后移动
        for (j = i - 1; j >= 0 && array[j] > key; j--)
        {
            array[j + 1] = array[j];
        }
        // 在合适位置安放当前元素
        array[j + 1] = key;
    }
}

 

 算法复杂度

 

如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上(n-1)次。平均来说插入排序算法复杂度为O(n2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。

 

分享到:
评论

相关推荐

    python常用排序算法汇总

    # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() #计数排序 # sort.quickSort() #快速排序 该排序算法把每次的排序结果都列出来,可供初学...

    排序算法-基于C语言实现的排序算法之InsertionSort实现.zip

    综上所述,这个压缩包文件提供了一个基于C语言实现的插入排序算法示例,通过学习和理解这段代码,可以深入理解插入排序的工作原理及其在C语言中的实现方式。这对于初学者提升算法知识和编程技能非常有帮助。

    基于python的排序算法-插入排序Insertion Sort

    **插入排序(Insertion Sort)**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到...

    常用排序算法java演示

    3. **插入排序(Insertion Sort)**:插入排序将数组分为已排序部分和未排序部分,每次取未排序部分的第一个元素,插入到已排序部分的合适位置。Java实现时,通常采用双指针,一个指向未排序部分,一个指向已排序...

    各种常用排序算法的C语言实现

    本资源提供了各种常用排序算法的C语言实现,源自严蔚敏的经典教材《数据结构》。下面将详细介绍这些排序算法及其在C语言中的实现原理。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序方法,通过不断交换相邻...

    各种排序的C++算法实现(插入排序、合并排序、堆排序、快速排序)

    全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...

    详解Java常用排序算法-插入排序

    在上面的代码中,`insertionSort` 函数接受一个整数数组作为输入,并使用插入排序算法对其进行排序。 插入排序算法的优点是: * 实现简单 * 在小型列表上的性能非常好 然而,插入排序算法的缺点是: * 时间...

    8大常用排序算法实现

    本文将详细解析八大常用排序算法的实现,帮助你更好地理解和测试这些算法。 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换,使得每次遍历都将最大(或最小)的元素“冒...

    C语言实现的插入排序

    在这个示例中,`insertion_sort`函数实现了插入排序算法,`print_array`函数用于打印数组。主函数`main`中,我们创建了一个数组并调用`insertion_sort`对其进行排序,最后打印排序结果。 插入排序的时间复杂度在...

    常用排序算法源码

    这里我们主要探讨五种常见的排序算法,这些算法的源码你可以在提供的压缩包文件中找到:MergeSort(归并排序)、RadixSort(基数排序)、InsertionSort(插入排序)、SwapSort(可能是冒泡排序或快速排序的误称)...

    插入,选择排序的链表实现及快速,希尔,冒泡排序算法实现合集

    1. 插入排序(Insertion Sort) 插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌。链表实现中,遍历每个元素,将每个元素插入到已排序部分的正确位置,形成一个有序序列。`insert_sort_linken_list....

    常用排序算法实现(java)

    本资源提供了五种经典的排序算法的Java实现,包括选择排序(Selection Sort)、插入排序(Insertion Sort)、希尔排序(Shell Sort)、归并排序(Merge Sort)以及快速排序(Quick Sort)。 1. **选择排序**:选择排序是一种...

    各种排序算法比较(java实现)

    2. **插入排序(Insertion Sort)**: 插入排序是一种简单的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O...

    图解插入排序-直接插入排序算法(straight insertion sort)

    图解插入排序——直接插入排序算法(straight insertion sort)

    内部排序算法比较 interal sort compare

    2. **插入排序(Insertion Sort)** 插入排序将未排序的元素逐个插入到已排序的序列中。它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。对于n个元素,最好情况(已排序)需要...

    Insertion sorting,插入排序,c++

    ### 插入排序算法详解与C++实现 #### 一、概述 插入排序(Insertion Sort)是一种简单直观的比较排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。...

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    插入排序(Insertion Sort)** 插入排序通过将每个元素插入到已排序的序列中的正确位置来实现排序。对于小规模或部分有序的数据,插入排序表现较好,但其平均和最坏情况下的时间复杂度也是O(n^2)。 **4. 合并排序...

    常用排序算法C++实现

    这里我们主要探讨8种常用的排序算法的C++实现:插入排序、选择排序、冒泡排序、二分插入排序、希尔排序、快速排序、堆排序以及归并排序。 1. **插入排序(Insertion Sort)**: 插入排序是一种简单的排序算法,它...

    常用排序算法C语言实现

    本资源"常用排序算法C语言实现"提供了一个实践平台,帮助学习者将理论知识转化为实际代码。 首先,让我们探讨几种常见的排序算法及其C语言实现: 1. **冒泡排序(Bubble Sort)**:冒泡排序是最基础的排序方法,...

    九种经典排序算法的实现

    1. **折半插入排序(Binary Insertion Sort)**: 折半插入排序是一种改进的插入排序,它通过二分查找找到合适的位置将元素插入,降低了比较的复杂度。其主要步骤包括:将数组分为已排序部分和未排序部分,然后逐个...

Global site tag (gtag.js) - Google Analytics