排序算法001——直接插入排序
2015-11-22 22:38
267 查看
**
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。
如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与最坏情况一样,其时间代价是Θ(n2)。
也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7比10小,应该再往左插,7比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。
**
n是数组的长度,首先假设第一个a[0]元素是已经排序好的,这样仅需从1~n-1范围内对剩余元素进行排序。对于每个待排序的元素a[i],从0~i-1范围内的元素已经被排好序,
每次遍历:通过扫描前面已排序的子列表,将位置i处的元素定位到从0到i的子列表之内的正确的位置上。
**
一、基本思想
**通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。
如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与最坏情况一样,其时间代价是Θ(n2)。
也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7比10小,应该再往左插,7比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。
**
二、算法描述
**n是数组的长度,首先假设第一个a[0]元素是已经排序好的,这样仅需从1~n-1范围内对剩余元素进行排序。对于每个待排序的元素a[i],从0~i-1范围内的元素已经被排好序,
每次遍历:通过扫描前面已排序的子列表,将位置i处的元素定位到从0到i的子列表之内的正确的位置上。
**
代码实现
**[code]public void insertSort(int [] a , int n){ int tmp; int j; for(int i = 1 ; i < a.length ; i++){ tmp = a[i]; for(j = i ; j>0 && tmp < a[j-1];j--){ a[j] = a[j-1]; } a[j] = tmp; } }
相关文章推荐
- TCP协议格式
- STL——配接器(adapters)
- 并发的单例陷阱
- PHP入门(8)-魔术变量
- 释放你的硬盘空间!——Windows 磁盘清理技巧
- R中包的安装方法
- STL——仿函数(函数对象)
- 【总结】大端、小端存储模式的那点事
- libevent的一个bug
- 转帖:PLSQL怎么创建oracle数据库用户
- 扩展欧几里得模板 poj-C Looooops
- iOS setValuesForKeysWithDictionary
- 信息安全系统设计基础第十周学习总结
- 用“计算机”,访问FTP
- 使用Andbase框架实现屏幕适配
- Java super关键字总结
- JAVA环境变量设置
- ssh
- PHP之路
- vs已停止工作的解决方案