【Algorithm】插入排序
一. 算法描述
插入排序具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
举个例子:5 7 6 4 3 8
第一趟:5 7 6 4 3 8 =》5 7 6 4 3 8
第二趟:5 7 6 4 3 8 =》5 6 7 4 3 8
第三趟:5 6 7 4 3 8 =》4 5 6 7 3 8
第四趟:4 5 6 7 3 8 =》3 4 5 6 7 8
第五趟:3 4 5 6 7 8 =》3 4 5 6 7 8
三. 算法实现
算法实现1
/*
* author:Knife
* time:2014.06.13 16:07
* Algorithm:插入排序(从前向后查找)
*/
#include<stdio.h>
void main_insertSort(){
int intArr[] = {,,,,,,,,,};
int n = sizeof(intArr)/sizeof(intArr[]); // 计算整型数组的长度
int i,j,k,tmp; for(i = ; i < n; i++){
for( j = ; j < i; j++){
if(intArr[i] < intArr[j]){ // 插入位置j
tmp = intArr[i];
for(k = i; k>j; k--){
intArr[k] = intArr[k-];
}
intArr[j] = tmp; // 插入
}
}
} // 打印输出
for(i=; i<n; i++){
printf("%d ",intArr[i]);
}
printf("\n");
}
算法实现2
/*
* author:Knife
* time:2014.06.13 16:07
* Algorithm:插入排序(从后向前查找)
*/
#include<stdio.h>
void main_1(){
int intArr[] = {,,,,,,,,,};
int n = sizeof(intArr)/sizeof(intArr[]); // 计算整型数组的长度
int i,j,tmp; //插入排序
for(i = ; i < n; i++){
tmp = intArr[i];
j = i-;
while(j>= && (tmp < intArr[j])){ // 插入位置
intArr[j+] = intArr[j];
j--;
}
intArr[j+] = tmp; // 插入操作
} // 打印输出
for(i=; i<n; i++){
printf("%d ",intArr[i]);
}
printf("\n");
}
算法实现3
#include<stdio.h>
/*
* author:Knife
* time:2014.06.13 16:43
* Algorithm:插入排序(二分查找)
*/
void main(){
int intArr[] = {,,,,,,,,,};
int n = sizeof(intArr)/sizeof(intArr[]); // 计算整型数组的长度
int i,j,low,high,mid,temp; for(i = ; i < n; ++i){
low = ;
high = i-;
while(low <= high){ //使用二分查找,寻找插入的位置
mid = low + ((high-low) >> ); //这种写法,有效避免溢出
if(intArr[i] > intArr[mid]){
low = mid + ;
}else{
high = mid - ;
}
} temp = intArr[i];
for(j = i; j > low; j--){ //移动元素
intArr[j] = intArr[j-];
} intArr[low] = temp; //在合适位置,插入。这里为什么是 low? 得仔细想想(答案参考文献[2])!
} // 打印输出
for(i = ; i < n; i++){
printf("%d ",intArr[i]);
}
printf("\n");
}
四. 算法分析
- 平均时间复杂度:O(n^2)
- 空间复杂度:O(1) (用于记录需要插入的数据)
- 稳定性:稳定
参考资料
[1] http://blog.csdn.net/zhangxiangdavaid/article/details/27373183
[2] http://blog.csdn.net/cjf_iceking/article/details/7916194
【Algorithm】插入排序的更多相关文章
- algorithm -- 插入排序
插入排序是<算法导论>中第一个介绍的算法,详细分析了插入排序的原理,执行过程,证明了算法的正确性.同时也引出了算法分析和算法分析常用的方法. 此文对原文作个转述,检验学到的知识. 文中使用 ...
- 【Algorithm】插入排序法
通常人们整理桥牌的方法是一张一张的来,将每一张插入到其他已经有序的牌中的适当位置. • 思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的序列的合适位置,直到全部插入排序完为止. Jav ...
- The insertion sort algorithm expressed in pseudocode - 插入排序
Computer Science An Overview _J. Glenn Brookshear _11th Edition procedure Sort (List) N ← 2; while ( ...
- 排序算法(sorting algorithm)之 插入排序(insertion sort)
https://en.wikipedia.org/wiki/Insertion_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 loop2: 4,6,1,3,7 -> ...
- [LeetCode] Insertion Sort List 链表插入排序
Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...
- algorithm -- 选择排序
选择排序是<导论>第一章课后习题,仿照插入排序,再次运用循环不变式来证明下算法的正确性,C++ 源码: // 交换函数 void swap( int& a, int& b ...
- 数据结构(DataStructure)与算法(Algorithm)、STL应用
catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...
- 疯狂的Java算法——插入排序,归并排序以及并行归并排序
从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根 ...
- MIT算法导论——第一讲.Analysis of algorithm
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
随机推荐
- 国内A股16家上市银行的財务数据与股价的因子分析报告(1)(工具:R)
分析人:BUPT_LX 研究目的 用某些算法对2014年12月份的16家国内A股上市的商业银行当中11项財务数据(资产总计.负债合计.股本.营业收入.流通股A.少数股东权益.净利润.经营活动的现金流量 ...
- js获取对象值的方式
js获取对象值的方式 var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用点的方式 var v2 = obj["abc&qu ...
- echart 图例设置自定义图标?
option = { legend: { orient: 'horizontal', // 'vertical' x: 'right', // 'center' | 'left' | {number} ...
- 如何通过 iframe 共享 jQuery $.data?
index.html <div id="div1"> </div> <iframe src="ajax2.html" name=& ...
- ZH奶酪:Python按行读取文件
1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...
- Android Studio 之 打包生成的 apk 安装包装到手机上闪退
今天,在 Android Studio 中的模拟器中测试 app 程序正常,然后打包 apk 安装包程序,发给领导后,领导反馈安装后打开闪退,抓紧安装到自己手机上,发现果然存在闪退.查阅资料后,解决方 ...
- 微信小程序 - 步骤条组件
<!-- 未激活颜色: uncolor:'#ccc' 激活 active:0 数据源 data:[{},{}] 步骤条类型:type basic detail num more --> & ...
- Extjs的各版本下载
Extjs的版本繁多,本文收集了Extjs各个版本的下载链接,包括官网和非官网的,以及各种汉化版api,欢迎大家下载分享. Extjs最新版下载链接:http://www.sencha.com/pro ...
- python2.7 安装pypcap出错 pcap.h not found
python安装pypcap的时候出错 通过不断百度+google找到解决方案 https://segmentfault.com/q/1010000007273835/a-10200000072756 ...
- Jquery 一些好用的插件和工具类
1.做页面校验的工具类 <!--area.js存放区域编码的一个常量.由于bee.js里面的getPersonInfo18()方法需要调用这个常量,所以在bee.js之前引入.如果不需要用到这个 ...