插入排序(Insert Sort)

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

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

1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找插入排序。

最坏时间复杂度O(n^2)
最优时间复杂度O(n)
平均时间复杂度O(n^2)
最坏空间复杂度 总共O(n) ,需要辅助空间O(1)

示例代码:

#include <iostream>
#include <algorithm>
using namespace std;
void insert(int a[], int len)
{
    for(int i=1; i<len; i++)
    {
        int key = a[i];
        int  j = i-1;
        while(j>=0 && (key<a[j]))
        {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = key;
    }
}
int main()
{
    int a[10] = {0,3,4,2,1,6,5,9,8,7};
    int len = sizeof(a)/sizeof(a[0]);
    insert(a, len);
    for(int i=0; i<len; i++)
    {
        cout << a[i] << ' ';
    }
    cout << endl;
    return 0;
}

运行截图:
avatar

  • SPFA

    算法训练-最短路径 适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。 我们约定有向加权图G不存在负权回路,即最短路径一定存在。...

    SPFA
  • 最短路径

    最短路径 建立邻接表(邻接矩阵也可以)12345678struct Node{ int v; //顶点 int dis; //权值 Node(int x, int y...

    最短路径
  • 算法训练-审美课

    算法训练-审美课 思路: 统计所有相同字符串的个数寻找和本身字符串数字完全相反的字符串两个字符串个数相乘将所有相乘的和加起来大佬解题思路:用map<string,int>cnt 存 注意:map<stri...

    算法训练-审美课
  • 简单dfs和bfs

    简单dfs和bfs 主要为如何做标记及递归处理 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950...

    简单dfs和bfs
  • 快速排序

    快速排序(Quick Sort) 主要事如何划分再排序,使用递归方法,即创建两个函数,一个划分,一个排序。划分伪代码:123456789101112i = lowx = A[low]for j=low+1 to high ...

    快速排序
  • 归并排序

    归并排序(Merge Sort) 是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用...

    归并排序
  • 冒泡排序

    冒泡排序(Bubble Sort) 是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是...

    冒泡排序
  • 选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排...

    选择排序
  • 链表基本操作

    链表基本操作 首先生成一个结构体,例如struct node{ int data; node *link;}; 1、创建单链表123456789101112131415161718192021222324252627...

    链表基本操作
  • 扩展欧几里得算法

    扩展欧几里得算法 用于求ax+by=gcd(a, b); 代码实现: 1234567def ext_euclid(a, b): if b == 0: return 1, 0, a else: ...

    扩展欧几里得算法