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

给手里的牌排序
这是最常见的例子之一,我们通常从纸牌的一边开始看,找到一张位置不正确的,把它拿出来,再从开始的位置开始找,直到找到合适者张牌插入的位置。
假设手里有这几张牌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之间。
排序就完成了,手里的纸牌也变成了正确的顺序,这种方法就叫做插入排序。
相应的算法设计:
- Start scanning the elements from 2nd position. The 1st is assumed to be at correct place.
- if ( arr[i] < arr[i-1])
- Swap arr[i] and arr[i-1]
- Keep swapping until the number is less than the previous number
- 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)的更多相关文章
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- [算法] 插入排序 Insertion Sort
插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-pla ...
- 排序算法 - 插入排序(Insertion sort)
插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...
- [Swift]LeetCode147. 对链表进行插入排序 | Insertion Sort List
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- 排序算法一:插入排序(Insertion sort)
最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根 ...
- 插入排序 Insertion Sort
插入排序算法的运作如下: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序算法的实现我放在这里. 时间/空间复杂度: 最差时间复杂度 O(n^2) 最优时间 ...
- 插入排序Insertion Sort
插入排序:将一个数据插入到一个已经排好序的有序数据序列中,从而得到一个新的.个数+1的有序数列:插入排序适用于少量数据排序,时间复杂度为O(n^2). 实现思路:1.对于一个无序数组,选取第一个元素, ...
- 插入排序——Insertion Sort
基本思想: 在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 过程: 平均时间复杂度:O(n2) jav ...
随机推荐
- eclipse3.7 安装maven插件与scm
转自:http://blacksonny.iteye.com/blog/1900275 最近要使用maven进行开发,之前的eclipse3.7 使用一下两个地址安装好了插件,如下: maven插件 ...
- iPhone 5,6,6 plus 尺寸
- Laravel-路由-控制器
(慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.基础路由 二.多请求路由 三.参数路由 四.路由别名 生成url可以使用别名 五.路由群组 六.路由输出视图 七.控制器参数绑定
- Linux备份
Eking<longpeisky@vip.qq.com> 19:35:17 增量备份是针对于上一次备份(无论是哪种备份):备份上一次备份后,所有发生变化的文件. (增量备份过程中,只备份 ...
- 基于Cordova5.0开发自己定义插件(android)
1.开发插件java部分 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhmMjE2MjE2/font/5a6L5L2T/fontsize/400/fi ...
- Layer中自定义属性的动画
转载自:http://blog.jobbole.com/69211/ 默认情况下,CALayer 及其子类的绝大部分标准属性都可以执行动画,无论是添加一个 CAAnimation 到 Layer(显式 ...
- 学习iOS必须知道的[转载]
part1 : http://www.cocoachina.com/ios/20150608/12052.html part2 : http://www.cocoachina.com/ios/2015 ...
- Web Api Session开启会话支持
1.WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型 //代码如下 public override voi ...
- 光盘自动运行HTML页,Autorun文件写法
1.把你的网页放在一个根目录下面,起名为index.html 2.在目录新建一个autorun.inf的文件,打开后编辑为以下内容: 代码如下: [autorun]icon=***.ico(加图标) ...
- FpSpread添加标注
先看效果 实现: FarPoint.Web.Spread.StyleInfo Errorcss = new FarPoint.Web.Spread.StyleInfo(); Errorcss.Bord ...