插入排序法基本原理

  插入排序法较冒泡排序法和选择排序法更贴近生活,应该来说理解起来更快。如果你现在能够得到一副麻将,请把里面的“一万”到“六万”拿出来,打乱顺序,再重新排好,就像打麻将开始那样。是否需要拿出某个麻将拿出来再插入其它麻将之间?这就是插入排序了。不过计算机没有你那么聪明,你只要小小几步就可以将麻将排序好,而计算机还要一个一个地比较,但是,它超快的速度使你根本不知道它的笨拙!同样,你也可以用扑克牌来试试。这里引用网络上的图片来理解这个排序方法。

  我们设定两个数组定位的变量i和j。array[i]指向数组第2~最后一个元素,我们用array[j]表示第0~i之前的最后一个元素,通过依次比较array[i]与array[j],array[j - 1],...直到比较到比它小的元素。因为终止比较时,array[j]指向一个比要插入的元素小的元素,而array[j + 1]和array[j + 2]是内容相同的元素,因此,我们要把array[i]插入到array[j + 1]。

  再来结合上图看代码(仔细分析,认真理解):

#include <stdio.h>
#include <stdlib.h> #define SIZE 10 int main(int argc, char * argv[]){
int i, j, temp, array[SIZE] = {,,,,,,,,,}; for(i = ; i < SIZE; i++){ //排序开始,把i初值定为数组第二个元素
temp = array[i]; //保存这个元素,然后方便比较和排序
for(j = i - ; j >= && array[j] > temp; j--)
//j最初表示i的前一个元素,通过与array[i]大小后,找到一个可插入的位置array[j + 1]
array[j + ] = array[j];//大的元素向后移,关键!
array[j + ] = temp; //插入!!!
} for(i = ; i < SIZE; i++)
printf("%-5d",array[i]); getch();
return ;
}

  这里需要注意的是,array[0]~array[i]是已经排序好的数组,我们称它为子数组,将array[i]后面的元素依次插入子数组直到没有元素可以插入,这个子数组就是整个数组,排序完成。

  有些地方出现的代码和上面的代码可能会不同,第二个循环我们用的是for而不是while。因为冒泡,选择,排序这样简单的排序算法都可以用一个for循环嵌套另一个for循环表示,为了方便记忆,我使用了前者。这里给出第二个循环用的是while的代码:

#include <stdio.h>
#include <stdlib.h> #define SIZE 10 int main(int argc, char * argv[]){
int i, j, temp, array[SIZE] = {,,,,,,,,,}; for(i = ; i < SIZE; i++){ //道理是一样的
j = i - ;
temp = array[i];
while(j >= && array[j] > temp){
array[j + ] = array[j];
j--;
}
array[j + ] = temp;
} for(i = ; i < SIZE; i++)
printf("%-5d",array[i]); getch();
return ;
}

  如果不理解,请照着代码把麻将或扑克牌排序几遍!

运行结果:

附:算法导论对插入排序法的介绍

"啃下"插入排序的更多相关文章

  1. Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析

    前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次.商城商品销量排名.新闻的搜索热度排名等等.也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天, ...

  2. 从零开始学习PYTHON3讲义(九)字典类型和插入排序

    <从零开始PYTHON3>第九讲 第六讲.上一讲我们都介绍了列表类型.列表类型是编程中最常用的一种类型,但也有挺明显的缺陷,比如: data = [5,22,34,12,87,67,3,4 ...

  3. 面试 10:玩转 Java 选择和插入排序,附冒泡最终源码

    昨天给大家讲解了 Java 玩转冒泡排序,大家一定觉得并没有什么难度吧,不知道大佬们玩转了吗?不知道大家有没有多加思考,实际上在我们最后的一种思路上,还可以再继续改进. 我们先看看昨天最终版本的代码. ...

  4. InsertionSort(插入排序)原理及C++代码实现

    插入排序是最常用的排序之一. 在输入规模较小的时候,插入排序的性能较好. 最好情况下插入排序的时间复杂度是O(n),平均情况则为O(n2). 插入排序是稳定的排序算法之一. 基本思路为从第二个元素开始 ...

  5. JS魔法堂:不完全国际化&本地化手册 之 理論篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  6. 【Hello CC.NET】CC.NET 实现自动化集成

    一.背景 公司的某一金融项目包含 12 个子系统,新需求一般按分支来开发,测完后合并到主干发布.开发团队需要同时维护开发环境.测试环境.模拟环境(主干).目前面临最大的两个问题: 1.子系统太多,每次 ...

  7. 万能的林萧说:我来告诉你,一个草根程序员如何进入BAT。

    引言 首先声明,不要再问LZ谁是林萧,林萧就是某著名程序员小说的主角名字. 写这篇文章的目的其实很简单,算是对之前LZ一篇文章的补充和完善. 之前LZ写过一篇<回答阿里社招面试如何准备,顺便谈谈 ...

  8. Github上安卓榜排名第2的程序员教你如何学习【转载,侵删】

    来自:峰瑞资本(微信号:freesvc)文章作者:代码家(微信 ID:daimajia_share) 软件早已吞噬整个世界,程序员是关键角色.过去 40 年中,许多伟大的公司都由程序员缔造,比如比尔· ...

  9. Daily Scrum Meeting ——NinthDay

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展 1.用户管理 2.下拉框与界面的整合 四.问题困难 黄志明(PM):Android Studio自带的S ...

随机推荐

  1. immutable-js基础

    Immutable.js(和原生方法不同): 用于深层次的数组和对象的比较   数据结构:Map Set Seq List Rang(和原生不同)   首先:先忘记es5 es6的数组对象方法   官 ...

  2. javascript的带操作符的赋值运算

    看犀牛书发现的问题 下面两个表达式 表达式一 data[i++] *= 2; 表达式二 data[i++] = data[i++] * 2;   var data = [7,8,9]; var i = ...

  3. ndk,cygwin编译 .so动态库

    注意: ndk .cygwin 安装路径尽量要和sdk放到一个磁盘里,设置环境变量. 例如D: 根目录  变量名:ndk   值:/cygdrive/d/android-ndk-r8e 打开cygwi ...

  4. 安装oracle服务端之后再安装oracle客户端导致sqlplus命令无法使用??

    首先小编自述一下所遇到的问题: 昨天在已经安装 oracle 服务端的 win7 X64 主机上安装 oracle client 之后,发现我的sqlplus命令无法用了??经过百度,都说我服务没有开 ...

  5. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) A】 Find Square

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找到左上角.往下一直走,往右一直走走到B边界就好. 中点的话.直接输出中位数 [代码] #include <bits/stdc ...

  6. selenium+java启动chrome浏览器

  7. (0)前言【从零开始学Spring Boot】

    在此对整体技术简单说明下. 开发工具和开发环境: Win7 64位操作 Eclipse-jee-mars-2-win32-x86_64 Jdk 1.8 Maven管理项目 如果要学习Spring Bo ...

  8. Global UNIX file system cylinder group cache

    A global cylinder group (CG) cache is stored in file server memory and shared by a plurality of file ...

  9. HBase读取代码

    HBase读取代码 需要的jar包: activation-1.1.jar aopalliance-1.0.jar apacheds-i18n-2.0.0-M15.jar apacheds-kerbe ...

  10. MVC发送邮件

    <> 发送邮件报错说明 发送邮件 假设发送人的邮箱username与邮箱password都没有填写错误:假设报:參数或变量中有语法错误. server响应为:mail from addre ...