数据结构之插入排序

参考----王道论坛2015年数据结构联考复习指南----

  算法稳定性:如果待排序表中有任意两个元素x1,x2相等,且排序前x1在x2的前面,使用某个排序算法之后,若x1仍然在x2的前面,则这个排序算法是稳定的.

一. 插入排序

  • 直接插入排序:最直观最简单的排序,适用于顺序存储和链式存储的线性表.
  • 折半插入排序:用了折半查找的排序,减少了元素的比较次数.
  • 希尔排序:又称为缩小增量排序.
  1. 直接插入排序

    实现将元素L(i)插入到已经有序的子序列L[1...i-1],中,需要执行:

      (1)查找L(i)在L[1...i-1]中的插入位置k.

      (2)将L[k...i-1]中的所有元素后移一位.

      (3)将L(i)复制到L(k).

    时间复杂度:O(n2),空间复杂度:O(1),稳定,算法代码如下:

 void InsertSort(ElemType A[], int n)
{
int i,j;
for (i=;i<=n;i++)
{
if (A[i]<A[i-])
{
A[]=A[i];
for (j=i-;A[]<A[j];--j)
A[j+]=A[j];
A[j+]=A[]
}
}
}
  2. 折半插入

    与直接插入类似,不同的是先找到(折半查找)要插入的位置,在移动插入点之后的所有元素.

      时间复杂度为O(n2),空间复杂度O(1),稳定,算法代码如下:

 void InsertSort(ElemType A[],int n)
{
int i,j,low,high,mid;
for (i=;i<=n;i++)
{
A[]=A[i];
low=;high=i-;
while(low<=high) //查找位置
{
mid=(low+high)/;
if (A[mid]>A[])
high=mid-;
else
low=mid+;
}
for (j=i-;j>=high+;--j)
{
A[j+]=A[j]; //移动元素
}
A[high+]=A[];
}
}
  3. 希尔排序

    直接插入排序适用于基本有序的排序表和数据量不大的排序表,基于此,出现了希尔排序,又称缩小增量排序.

    基本思想:先将待排序表分割成若干形如L[i,i+d,i+2d...i+kd]的特殊子表,分别进行直接插入排序,直到整个表已经是基本有序,再对全体进行一次直接插入排序.

    流程如下:先取一个小于n的步长d1,把表中的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组中进行直接插入排序;然后取第二个步长d2<d1,重复上述过程,直到dt=1,即所有记录放在同一组中,再进行直接插入排序,希尔提出的增量序列为d1=n/2;di+1=floor(di/2),(floor:向下取整函数),并且最后一个增量为1.

    时间复杂度:最坏情况下为O(n2),空间复杂度为O(1),不稳定,算法代码如下:

 void ShellSort(ElemType A[],int n)
{
int dk,i,j;
//前后记录位置的增量是dk,不是1
for (dk=n/;dk>=;dk=dk/)
{
for (i=dk+;i<=n;++i)
{
if (A[i]<A[i-dk])
{
A[]=A[i];
for (j=i-dk;j> && A[]<A[j];j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[];
}
}
}
}

参考书目:

王道考研系列

高分笔记系列

排序-InsertSort的更多相关文章

  1. 几种常见的排序方法(C语言实现)

    #include <stdio.h> #include <stdlib.h> #include <Windows.h> //直接插入排序 void InsertSo ...

  2. c排序

    #pragma once//如果写头文件 放置头文件重复包含 #include<stdio.h> //定义类型 结构体类型定义 //宏定义 #define //函数申明 void prin ...

  3. 插入排序法-java案例详解

    /** * 功能:插入排序法 * 基本思想:把n个待排序的元素看成一个有序和无序表,开始时有序表中只包含一个元素, * 无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码 ...

  4. 经典算法分析:n^2与nlgn

    冒泡.插入.选择排序的时间复杂度为O(n2) Arrays.sort()时间复杂度为nlgn 具体算法实现代码: package recursion; import java.util.Arrays; ...

  5. 笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子

    出题:要求用递归将一个栈结构的元素内外颠倒: 分析: 本题再次说明系统栈是程序员最好的帮手,但递归度较高所以时间复杂度较大,可以使用空间换时间的方法(额外数组保存栈元素,然后逆向压入): 第一层递归( ...

  6. 三大基础排序算法BubbleSort、SelectSort、InsertSort

    public class Strategy { public static void main(String[] args) { int [] array=new int[]{26,25,15,42, ...

  7. Java基础知识强化54:经典排序之插入排序(InsertSort)

    1. 插入排序原理图: 算法步骤: 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位 ...

  8. 排序算法FIVE:插入排序InsertSort

    /** *插入排序思路:O(n^2) * 最外层一个循环,从第二个数到最后一个,变量为i * 每个数存储在key变量中 * 变量j,是左边已经排好序的数组的上限 * 判断key与前面每一个数比较 1, ...

  9. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

随机推荐

  1. SublimeText插件cssrem : px转换为rem

    步骤: 下载插件: https://github.com/flashlizi/cssrem 安装插件: 打开:Sublime Text 点击: Preferences 选择: Browse Packa ...

  2. ARM平台指令虚拟化初探

    0x00:什么是代码虚拟化? 虚拟机保护是这几年比较流行的软件保护技术.这个词源于俄罗斯的著名软件保护软件“VmProtect”,以此为开端引起了软件保护壳领域的革命,各大软件保护壳都将虚拟机保护这一 ...

  3. List之Sort使用

    void TestListSort(){ List<string> st = new List<string> (); st.Add ("abcd"); s ...

  4. 【Android 界面效果46】自定义view常处理的回调方法

    onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, ...

  5. excel跨表查询数据

    环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示:            左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...

  6. 花3分钟了解下C/C++中的函数可变参简单实现

    1.可变参函数的原理 C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数.所以,可变 ...

  7. CMAKE 安装

    下载 解压  https://cmake.org/download/ https://cmake.org/files/v3.7/cmake-3.7.1.tar.gz yum install gcc - ...

  8. java对字符串进行加密和解密(以下是来自其他博主)

    背景:需要对读取数据库配置的文件进行加密,防止他人拿到数据,而对自己的代码,有要实现进行解密,网上给的加密方式,什么MD5,base64,还有等等,都太复杂,而且有些是单向的,只加密不解密,以下代码, ...

  9. 使用命令创建jenkins的job,解决jenkinsapi.custom_exceptions.JenkinsAPIException错误

    如果你使用 Python 2.7.12,Jenkins版本为Jenkins ver. 2.22,你使用我上面一种提到的修改的以下代码可以进行Jenkins的job复制 http://www.cnblo ...

  10. 转:SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    转:https://www.cnblogs.com/zyw-205520/p/4771253.html 1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于2003 年 ...