算法描述

插入排序是在一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。插入排序是一种稳定的排序。

基本思想

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

实现步骤

  1. 从第一个元素开始,这个元素可以认为已经被排序;
  2. 取出下一个元素a[i],按照从后往前的速度开始扫描;
  3. 如果当前的元素值比a[i]小,则将该元素下移一位;
  4. 如果当前的元素值比a[i]大,则将a[i]放到此元素的下一个位置;
  5. 重复步骤2,直到完成所有的元素的排序。

算法实现

//插入排序
void InsertionSort(int a[], int length)
{
//排序序列中的第i个元素,i属于[1,2,...,n]的区间
for(int i = ; i <= length; i++)
{ int temp = a[i];
//a[1],a[2],...,a[i-1]序列是有序的,插入a[i]
for(int j = i- ; j >= -; j--)
{
if( a[j] <= temp)
{
//将第j-1的元素赋值给第j位
a[j+] = a[j];
} //完成排序的条件:1.a[j]>temp;2.j移动到-1的位置
if( a[j] > temp || j < )
{
//排序完毕,将temp赋值给a[j+1]
a[j+] = temp;
break;
}
}
}
}

性能分析

如果数组是有序的,那么需要n-1次的比较,时间复杂度为o(n)

如果数组不是有序的,那么时间复杂度为o(n^2),所以平均时间复杂度为o(n^2)

空间复杂度为o(1)

插入排序(InsertionSort)的更多相关文章

  1. 插入排序InsertionSort

    /** * * @author Administrator * 功能:插入排序法 */ package com.test1; import java.util.Calendar; public cla ...

  2. 插入排序(InsertionSort)

    位置p上的元素存储于tmp(第一趟p通常取1),而(位置p之前)所有更大的元素都向右移动一个位置. 然后tmp被放在正确的位置上. 代码: public class InsertionSort { p ...

  3. 【子非鱼】插入排序过程呈现之java内置GUI表示

    先给代码,再给过程视频: package com.dyi.wyb.sort; import java.awt.Color; import java.awt.Graphics; import java. ...

  4. 【开发者笔记】插入排序过程呈现之java内置GUI表示

    先给代码,再给过程视频: package com.dyi.wyb.sort; import java.awt.Color; import java.awt.Graphics; import java. ...

  5. Android复习指南

    基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域.这里面其实有很多东西,各大面试宝典都有列举. 在这只列举了Android客户端所需要的和我 ...

  6. 经典排序算法总结与实现 ---python

    原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用P ...

  7. JS中的算法与数据结构——排序(Sort)(转)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

  8. 归并排序及优化(Java实现)

    普通归并排序 public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid 本次归并的中间位 ...

  9. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

  10. JS中的算法与数据结构——排序(Sort)

    排序算法(Sort) 引言 我们平时对计算机中存储的数据执行的两种最常见的操作就是排序和查找,对于计算机的排序和查找的研究,自计算机诞生以来就没有停止过.如今又是大数据,云计算的时代,对数据的排序和查 ...

随机推荐

  1. SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题

    controller public class HelloWorldController implements Controller { public ModelAndView handleReque ...

  2. 2015/9/2 Python基础(7):元组

    为什么要创造一个和列表差别不大的容器类型?元组和列表看起来不同的一点是元组用圆括号而列表用方括号.而最重要的是,元组是不可变类型.这就保证了元组的安全性.创造元组给它赋值和列表完全一样.除了一个元素的 ...

  3. gridveiw的使用

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  4. TOJ 1005 Hero In Maze (深搜)

    描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人^_^. 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中.Jesse听说这个消息已经是两天以后了,他知道公主在迷宫 ...

  5. 【HNOI】五彩斑斓 模拟

    [题目描述] 给定一个n*m的矩阵,矩阵的某些位置有一个颜色(可以没有颜色,即为0),现在你可以将矩阵的某一行或者某一列染成同一种颜色,问最少用多少步能达到目标矩阵的染色方案,输出最少步数和方案. [ ...

  6. 多github帐号的SSH key切换

    我有两个github帐号,一个是个人所用,一个是为公司项目所用.如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥对比:如果是多用户(multi-user ...

  7. 网络知识===wireshark抓包数据分析(一)

    wireshark分析: 上图是我进行一个HTTP协议的下载,文件内容大概是1.7M左右. 抓包数据: https://files.cnblogs.com/files/botoo/wireshark% ...

  8. OPENSOLARIS source

    http://blog.csdn.net/nemo2011/article/details/8543220 http://fxr.watson.org/fxr/source/?v=OPENSOLARI ...

  9. MVC 从控制器将数据对象赋值给前端JS对象

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  10. [hadoop][基本原理]zookeeper场景使用

    代码:https://github.com/xufeng79x/ZkClientTest 1. 简介 zookeeper的特性决定他适用到某些场景非常合适,比如典型的应用场景: 1.集群管理(Grou ...