这是排序算法中最常见的排序方法,也是初学者使用最多的。有时候我们在生活中也会不自觉地用到插入排序,例如:

给手里的牌排序

这是最常见的例子之一,我们通常从纸牌的一边开始看,找到一张位置不正确的,把它拿出来,再从开始的位置开始找,直到找到合适者张牌插入的位置。

假设手里有这几张牌2,4,6,3,10,K,J。排序的步骤如下:

  • 假设我们从左边开始看,2位置正确,4位置正确,6位置正确,3错误,他比前面的6要小。
  • 需要给3重新找到正确位置。
  • 取出3这张牌,冲头开始看,3比2大,再往后,3比4小,因此3插入2和4之间的位置。现在纸牌的顺序变成了2,3,4,6,10,K,J。
  • 接着上次我们离开的点开始看(就是3的位置,现在变成了6),6位置正确,10位置正确,K位置正确,J位置不正确,因为他比前面的K小。
  • 把J拿出来,重头开始看,J比2,3,4,6,10都大,比K小,因此插在10和K之间。

排序就完成了,手里的纸牌也变成了正确的顺序,这种方法就叫做插入排序。

相应的算法设计:

  1. Start scanning the elements from 2nd position. The 1st is assumed to be at correct place.
  2. if ( arr[i] < arr[i-1])
    1. Swap arr[i] and arr[i-1]
    2. Keep swapping until the number is less than the previous number
  3. The array gets sorted as we reach the end.

下面是具体执行代码:

#include<stdio.h>

// function to swap two integers
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
} // a function to perform Insertion Sort on the array arr with size specified
void insertionSort(int arr[],int size)
{
int i,j; // iterating from 2nd element to the last
for(i=1;i<size;i++)
{
if(arr[i] < arr[i-1])
{
j = i;
while(arr[j-1] > arr[j])
{
// swapping all the numbers
// until the next number is smaller than previous number
swap(&arr[j],&arr[j-1]);
j--;
}
}
}
} // driver function to test the above function
int main(void)
{
int i;
int arr[10] = {3, 4, 7, 1, 10, 8, 2, 22, 99, 50}; insertionSort(arr,10); printf("SORTED array:- ");
for(i=0;i<10;i++)
printf("%d ",arr[i]); return 0;
}

时间复杂度:

Average Case:- O(n2)
Best Case:- O(n)
Worst Case:- O(n2)

插入排序(Insertion Sort)的更多相关文章

  1. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  2. 排序算法--插入排序(Insertion Sort)_C#程序实现

    排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...

  3. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  4. [算法] 插入排序 Insertion Sort

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

  5. 排序算法 - 插入排序(Insertion sort)

    插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...

  6. [Swift]LeetCode147. 对链表进行插入排序 | Insertion Sort List

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

  7. 排序算法一:插入排序(Insertion sort)

    最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根 ...

  8. 插入排序 Insertion Sort

    插入排序算法的运作如下: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序算法的实现我放在这里. 时间/空间复杂度: 最差时间复杂度 O(n^2) 最优时间 ...

  9. 插入排序Insertion Sort

    插入排序:将一个数据插入到一个已经排好序的有序数据序列中,从而得到一个新的.个数+1的有序数列:插入排序适用于少量数据排序,时间复杂度为O(n^2). 实现思路:1.对于一个无序数组,选取第一个元素, ...

  10. 插入排序——Insertion Sort

    基本思想: 在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 过程: 平均时间复杂度:O(n2) jav ...

随机推荐

  1. chapter 2: Representing and manipulating information

    C allows conversion between unsigned and signed. The rule is that the underlying bit representation ...

  2. hdu 5410 CRB and His Birthday(混合背包)

    Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...

  3. poj 3744 Scout YYF I (矩阵)

    Description YYF -p. Here is the task, given the place of each mine, please calculate the probality t ...

  4. js笔记01

    js编写页面特效动态脚本类型的语言变量:存储数据(日常生活中的东西,比如电视,手机,电脑,出生年份...)语法: var obj=value; obj不能为数字开头,且区分大小写 value对应数据类 ...

  5. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  6. Css中的变形及过渡动画

    在css3的标准中新增加了变形样式,这些样式使得网页中各元素的位置形状的变换变得更加容易.其语法如下: transform:none | <transform-function>+ 其中对 ...

  7. Linux命令vi/vim编辑

    一.vi的基本概念基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:a) 命令 ...

  8. linux 服务器更主板后无法识别网卡处理过程

    linux 服务器更主板后无法识别网卡处理过程   服务器故障报修,主板坏,更换主板后无法识别网卡,ifconfig 查看只显示:lo loopback 127.0.0.1. 系统加载网卡驱动后会去读 ...

  9. thinking in java知识小记(一)

    知识点一(javadoc): 使用javadoc时特别注意选择encoding和charset为utf-8,要不然生成的javadoc会是乱码,命令:javadoc -encoding utf-8 - ...

  10. Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)

    1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...