直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其keyword大小插入到前面已经排好序的子序列中的适当位置,直到所有记录插入完毕为止。

设数组为a[0…n-1]。

1.     
初始时。a[0]自成1个有序区,无序区为a[1..n-1]。令i=1

2.     
将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。

3.      i++并反复第二步直到i==n-1。

排序完毕。

代码实现:

//

//  main.m

// 
算法----插入排序(Insertion sort)

//  Copyright (c) 2014年 summer2014mht@sina.com. All rights reserved.

//

#import
<Foundation/Foundation.h>

int main(int argc,
const char * argv[])

{

int array[] = {3,2,
6, 9, 8,
5, 7, 1,
4};

//为了添加可移植性(採取sizeof())计算数组元素个数count

int count = sizeof(array) /sizeof(array[0]);

//逐个记录,插入有序数列

for (int i = 1; i < count; i++) {

int j = i;  //j是一个坑,
确定坑的位置,再把数从坑里取出来,注意顺序

int temp = array[i];   //temp 是从坑里取数

//把a[i]插入有序序列

while (j > 0 && temp < array[j -1]) {   
//j > 0 防止越界。写&&前面效率更高

array[j] = array[j -
1];

j--;

}

array[j] = temp;

}

for (int i = 0; i < count; i++) {

printf("[%2d]: %d\n", i, array[i]);

}

return 0;

}

附:效率分析

稳定

空间复杂度O(1)

时间复杂度O(n2)

最差情况:反序。须要移动n*(n-1)/2个元素

最好情况:正序,不须要移动元素

数组在已排序或者是“近似排序”时。插入排序效率的最好情况执行时间为O(n)。

插入排序最坏情况执行时间和平均情况执行时间都为O(n2)。

通常,插入排序呈现出二次排序算法中的最佳性能。

对于具有较少元素(如n<=15)的列表来说,二次算法十分有效。

在列表已被排序时,插入排序是线性算法O(n)。

在列表“近似排序”时。插入排序仍然是线性算法。

在列表的很多元素已位于正确的位置上时。就会出现“近似排序”的条件。

通过使用O(nlog2n)效率的算法(如高速排序)对数组进行部分排序,

然后再进行选择排序,某些高级的排序算法就是这样实现的。

从上述分析中能够看出,直接插入排序适合记录数比較少、给定序列基本有序的情况

IOS算法(三)之插入排序的更多相关文章

  1. python实现排序算法三:插入排序

    插入排序基本思想:假设一个无序数组A,则对于只有一个元素A[0]的子数组C来讲,其是有序的,然后将A[1]插入到C中,则就是将A[1]与A[0]进行比较,如果A[1]比A[0]小,则交换两者的顺序,这 ...

  2. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  3. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  4. 我的Java开发学习之旅------>Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

  5. python算法与数据结构-插入排序算法(34)

    一.插入排序的介绍 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我 ...

  6. iOS开发三步搞定百度推送

    iOS开发三步搞定百度推送   百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...

  7. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  8. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  9. 《算法导论》插入排序----InsertSort

    算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...

随机推荐

  1. Git使用记录(二)

    一)git init 初始化仓库 要使用Git进行版本管理,必须先初始化仓库,请先建立一个目录并初始化仓库 mkdir gittest cd gittest git init 初始化成功以后会在当前目 ...

  2. 【转】AC算法详解

    原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...

  3. python数值计算模块NumPy scipy安装

    NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了这两个库,Python就有几乎和Matlab一样的处理数据和计算的能力 ...

  4. [转]WIBKIT技术资料

    WebKit结构和流程分析 http://inedx.blog.hexun.com/28830354_d.html webkit架构 http://inedx.blog.hexun.com/28795 ...

  5. hdoj 1532 Drainage Ditches(最大网络流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路分析:问题为最大网络流问题,给定一个有向图,需要求解该有向图的最大网络流,使用Edmonds ...

  6. EnumMap源代码阅读器

    EnumMap是一个用于存放键值为enum类型的map.全部的键值必须来自一个单一的enum类型.EnumMap内部用数组表示效率更高. EnumMap维持键值的自然顺序(即枚举类型常量声明的顺序), ...

  7. x0vncserver Fatal server error: no screens found

    I make a connection through SSH and  then I type: # x0vncserver --PasswordFile=/home/hello/.vnc/pass ...

  8. Cocos2d-x 3.0 使用TinyXml 解析XML文件

    在cocos2d-x 3.0中Xml解析已经不用自己找库了,已经为我们集成好了. text.xml <!--?xml version ="1.0" encoding =&qu ...

  9. Js动态设置Img大小

    function ResizePic() {        $('img').each(function () {            var maxWidth = 450; // 图片最大宽度   ...

  10. 转载 js判断浏览器

    $scope.identifyBrowser= function () { var userAgent = navigator.userAgent, rMsie = /(msie\s|trident. ...