直接插入排序(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. hdu 5104 Primes Problem(prime 将三重循环化两重)

    //宁用大量的二维不用量小的三维 #include <iostream> #include<cstdio> #include<cstring> using name ...

  2. ##DAY1 UI、frame、center、bounds、UIVIew

    ##DAY1 UI.frame.center.bounds.UIVIew #pragma mark ———————UI——————————— UI的本意是用户界面,是英文User和 Interface ...

  3. JQuery中文本框获取焦点

    今天遇见这么一个小小的问题,就是文本框中需要输入内容才可以提交,如果没有输入就提示并使该文本框获得焦点! 这么一个简单的事情如果没有使用jQuery的话 是不是对象.focus()就可以了, 可是当我 ...

  4. web应用之监听器

    package com.log.service; import java.util.Enumeration; import javax.servlet.ServletContext; import j ...

  5. Latex调整行距

    修改行间距的方法: \usepackage{setspace}%使用间距宏包 \begin{document} \begin{spacing}{2.0}%%行间距变为double-space 双倍行距 ...

  6. [LeetCode]题解(python):128-Longest Consecutive Sequence

    题目来源: https://leetcode.com/problems/longest-consecutive-sequence/ 题意分析: 给定一个没有排好序的数组,找到最长的连续序列的长度.要求 ...

  7. 基于FPGA的cordic算法的verilog初步实现

    最近在看cordic算法,由于还不会使用matlab,真是痛苦,一系列的笔算才大概明白了这个算法是怎么回事.于是尝试用verilog来实现.用verilog实现之前先参考软件的程序,于是先看了此博文h ...

  8. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  9. MVC 优缺点

    MVC是一个架构,或者说是一个设计模式,它就是强制性使应用程序的输入,处理和输出分开.将一个应用程序分为三个部分:Model,View,Controller. 1. MVC的优点 (1) 可以为一个模 ...

  10. Linux设置高分辨率后无法进入X系统

    Vmware9.0中Xubuntu分辨率从800x600变更为1366x768后在用户输入密码登录后会自动退出x系统,出现这种情况时可以切换到命令行登录界面,然后将-/.config/xfce4/xf ...