IOS算法(三)之插入排序
直接插入排序(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算法(三)之插入排序的更多相关文章
- python实现排序算法三:插入排序
插入排序基本思想:假设一个无序数组A,则对于只有一个元素A[0]的子数组C来讲,其是有序的,然后将A[1]插入到C中,则就是将A[1]与A[0]进行比较,如果A[1]比A[0]小,则交换两者的顺序,这 ...
- 排序算法三:Shell插入排序
排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...
- Java常见排序算法之直接插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 我的Java开发学习之旅------>Java经典排序算法之二分插入排序
一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...
- python算法与数据结构-插入排序算法(34)
一.插入排序的介绍 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我 ...
- iOS开发三步搞定百度推送
iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_s ...
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- Java常见排序算法之折半插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 《算法导论》插入排序----InsertSort
算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...
随机推荐
- .Net Web开发中实现剪切板功能
我要实现的功能是:在列表页,通过一个按钮复制对应的文章Url,如下图: 如下代码: <a class="btn btn-success copy" href=&quo ...
- mysql 数据备份
一.备份数据库并下载到本地[db_backup.php] php代码: <?php // 数据库参数(此处测试,直接给定,项目中使用配置文件) $cfg_dbname = 'blog'; $cf ...
- MysqlHelp
using System.Configuration;using MySql.Data: public class MySqlHelp { //链接字符串 private static string ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- ThinkPHP第十三天(CONF_PATH、APP_PATH,UEditor用法)
1.CONF_PATH 项目配置文件目录地址,APP_PATH 项目地址 2.ThinkPHP中更新数据的连接操作位save(),更新一个字段可以用setField(name,value)方法. 3. ...
- YII框架下实现密码修改
YII2 实现修改密码功能 主要难点: 1.密码加密 YII2对密码加密生成的结果是不同的,即用相同的初始密码在不同时间得到的加密结果不同,所以我们不能用常用的方法去验证密码是否正确(将密码加密后与数 ...
- jenkins上集成fitnesse
烂笔头胜过好记性,恩,养成随手记的习惯 Fitnesse是完全有Java开发的测试框架,跨平台并且便于与其他测试框架和工具的合并(Jenkins.TestNG,Junit以及Selenium的集成) ...
- night Mode 夜间模式css
*,*:before,*:after,html[mode='nightmode'] * { color: #61615f !important; border-color: #212a32 !impo ...
- javascript 定义类(转载)
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1) java中的返回值void和JNI中的void是完全对应的哦! ...