直接插入排序(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. JQuery DataTable插件

    参考文件: http://blog.csdn.net/xuechongyang/article/details/8424897 http://blog.csdn.net/llhwin2010/arti ...

  2. 如何用cocoapods 来管理项目中的第三方框架?

     一.安装 1.如果以前安装过,升级到10.10后工作不正常,可以先删除cocoapods $ sudo gem uninstall cocoapods ----------------------- ...

  3. python笔记之第一次使用(未入门)

    刚开始学习python,之前完全没有接触,在这里写下自己学习python的过程和心得. 首先,安装python,打开官网:http://python.org.点击Download.我选择了3.5.1版 ...

  4. java集合分析(转载)

    参考文章:浅谈Java中的Set.List.Map的区别 Java 7 Collections详解 java中集合分为三类: Set(集) List(列表) Map(映射) Set和List继承自Co ...

  5. github桌面软件使用教程

    github桌面软件使用教程 首先 要先安装 桌面版官网,或者百度搜github windows下载即可 可以再github网站上直接点击,把代码添加的桌面软件中 也可以再左上角添加项目,比如actu ...

  6. w3c标准的selection对象介绍

    简介 术语 属性 方法 document.activeElement document.designMode = 'on'; 简介 selection是对当前激活选中区(即高亮文本)进行操作. 在非I ...

  7. JAVA GUI学习 - JMenuBar菜单条、JMenu菜单、JMenuItem菜单项组件学习

    public class MenuBarKnow extends JFrame { JMenuBar jMenuBar; JMenu jMenuFile,jMenuEditor,jMenuAbout; ...

  8. android 中文 api (71) —— BluetoothServerSocket[蓝牙]

    前言 本章内容是  android.bluetooth.BluetoothServerSocket,为Android蓝牙部分的章节翻译.服务器通讯套接字,与TCP ServerSocket类似.版本为 ...

  9. Android 中文API (67) —— BluetoothClass.Device.Major

    前言 本章内容是android.bluetooth.BluetoothClass.Device.Major,为Android蓝牙部分的章节翻译,版本为Android 2.3   r1,翻译来自中山大学 ...

  10. js字符串大小写转换

    var str = 'hello world'; alert(str.toUpperCase());//将字符串转换为大写. alert(str.toLowerCase());//将字符串转换为小写. ...