一. 算法描述

  插入排序具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤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】插入排序的更多相关文章

  1. algorithm -- 插入排序

    插入排序是<算法导论>中第一个介绍的算法,详细分析了插入排序的原理,执行过程,证明了算法的正确性.同时也引出了算法分析和算法分析常用的方法. 此文对原文作个转述,检验学到的知识. 文中使用 ...

  2. 【Algorithm】插入排序法

    通常人们整理桥牌的方法是一张一张的来,将每一张插入到其他已经有序的牌中的适当位置. • 思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的序列的合适位置,直到全部插入排序完为止. Jav ...

  3. The insertion sort algorithm expressed in pseudocode - 插入排序

    Computer Science An Overview _J. Glenn Brookshear _11th Edition procedure Sort (List) N ← 2; while ( ...

  4. 排序算法(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 -> ...

  5. [LeetCode] Insertion Sort List 链表插入排序

    Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...

  6. algorithm -- 选择排序

    选择排序是<导论>第一章课后习题,仿照插入排序,再次运用循环不变式来证明下算法的正确性,C++ 源码: // 交换函数 void swap( int& a, int& b ...

  7. 数据结构(DataStructure)与算法(Algorithm)、STL应用

    catalogue . 引论 . 数据结构的概念 . 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 二叉树 . 物理结构实例 3.1 链表 单向线性链表 单向循环链表 双向线性链表 双向 ...

  8. 疯狂的Java算法——插入排序,归并排序以及并行归并排序

    从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根 ...

  9. MIT算法导论——第一讲.Analysis of algorithm

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

随机推荐

  1. PowerShell获取当前用户的权限

      function Get-CurrentUserRoles {   $SecurityPrinciple = New-Object -TypeName System.Security.Princi ...

  2. C# winForm webBrowser页面中js调用winForm类方法(转)

      有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部:   1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...

  3. jetty 9使用

    jetty 9 使用 下载jdk 7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-ja ...

  4. SpringBoot添加对jsp的支持

    1.在pom.xml添加如下内容: <dependency> <groupId>org.apache.tomcat.embed</groupId> <arti ...

  5. Oracle 定时任务使用

    1:首先创建存储过程 create or replace procedure pro_rqsl_hmd is rsCursor sys_refcursor; rqslid ); nsrsbh ); h ...

  6. 007-Go package 说明

    1:在项目src下面存在两个目录,每个目录里面各有一个go文件 2:add.go package test02 func Add(a int, b int) int{ return a + b } 注 ...

  7. Mybatis中的延迟加载的使用方法

    Mybatis中的延迟加载的使用方法 在Mybatis中查询订单,然后带出商品信息和快递信息的配置方法 orderMapper.xml配置如下 <?xml version="1.0&q ...

  8. Tomcat上文件的绝对路径访问笔记

    部署到Tomcat上的web项目的文件在代码中访问,可以先通过request获取到项目的根目录绝对路径,然后自己拼接子目录路径,直到文件.方法如下: String realpath=request.g ...

  9. BIEE启动关闭服务(转)

    一.环境说明 版本:BIEE11g (BIEE_11.1.1.9.0) OS:CentOS 6.5 64bit (所有的linux服务器都适用) 二.BIEE启动与关闭 BIEE11g 的启动包括三个 ...

  10. MySQL优化系列

    https://blog.csdn.net/Jack__Frost/article/details/73347688