排序-InsertSort
数据结构之插入排序
参考----王道论坛2015年数据结构联考复习指南----
算法稳定性:如果待排序表中有任意两个元素x1,x2相等,且排序前x1在x2的前面,使用某个排序算法之后,若x1仍然在x2的前面,则这个排序算法是稳定的.
一. 插入排序
- 直接插入排序:最直观最简单的排序,适用于顺序存储和链式存储的线性表.
- 折半插入排序:用了折半查找的排序,减少了元素的比较次数.
- 希尔排序:又称为缩小增量排序.
直接插入排序
实现将元素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的更多相关文章
- 几种常见的排序方法(C语言实现)
#include <stdio.h> #include <stdlib.h> #include <Windows.h> //直接插入排序 void InsertSo ...
- c排序
#pragma once//如果写头文件 放置头文件重复包含 #include<stdio.h> //定义类型 结构体类型定义 //宏定义 #define //函数申明 void prin ...
- 插入排序法-java案例详解
/** * 功能:插入排序法 * 基本思想:把n个待排序的元素看成一个有序和无序表,开始时有序表中只包含一个元素, * 无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码 ...
- 经典算法分析:n^2与nlgn
冒泡.插入.选择排序的时间复杂度为O(n2) Arrays.sort()时间复杂度为nlgn 具体算法实现代码: package recursion; import java.util.Arrays; ...
- 笔试算法题(21):将stack内外颠倒 & 判断扑克牌顺子
出题:要求用递归将一个栈结构的元素内外颠倒: 分析: 本题再次说明系统栈是程序员最好的帮手,但递归度较高所以时间复杂度较大,可以使用空间换时间的方法(额外数组保存栈元素,然后逆向压入): 第一层递归( ...
- 三大基础排序算法BubbleSort、SelectSort、InsertSort
public class Strategy { public static void main(String[] args) { int [] array=new int[]{26,25,15,42, ...
- Java基础知识强化54:经典排序之插入排序(InsertSort)
1. 插入排序原理图: 算法步骤: 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位 ...
- 排序算法FIVE:插入排序InsertSort
/** *插入排序思路:O(n^2) * 最外层一个循环,从第二个数到最后一个,变量为i * 每个数存储在key变量中 * 变量j,是左边已经排好序的数组的上限 * 判断key与前面每一个数比较 1, ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
随机推荐
- ActiveMQ实例1--简单的发送和接收消息
一.环境准备 1,官网http://activemq.apache.org/下载最新版本的ActiveMQ,并解压 2,打开对应的目录,在Mac环境下,一般可以运行命令: cd /Users/***/ ...
- MarkDown 编辑器学习
MarkDown 编辑器学习 是一种简单快键的文字排版工具,可以用于编写说明文档,鉴于其语法简洁明了,且其渲染生成的样式简单美观,很多开发者也用它来写博客,已被国内外很多流行博客平台所支持.生成的文件 ...
- Oracle数据表比较记录差异(转)
liuyx_know|七级 你可以参照一下Oracle的UNION [ALL], INTERSECT, MINUS操作符,至于你的问题你可以使用MINUS操作符,语句如下: SELECT * FROM ...
- C语言总结的知识点
什么是有效数字? ------------------------- 数据类型 运算符: 函数: 程序结构: 存储结构 内存管理 关键字: ------------------------- C语言: ...
- Selenium入门17 selenium IDE安装及使用
selenium IDE是firefox浏览器的一个插件,支持脚本的录制回放,关键字驱动的.界面跟robotframework很像. 实际测试中不用录制回放,不过初学者拿来看看元素是如何定位的还是有用 ...
- bzoj1150 [CTSC2007]数据备份
Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中 ...
- Ubuntu 18.04 一键安装深度截图工具 Deepin Screenshot
一直在寻找Linux下的截图软件,终于发现了Deepin ScreenShot,其功能齐全,界面美观,唯一的缺点需要自己配置快捷键(后面会讲). 安装 直接在Ubuntu商店搜索“深度截图”,点击“安 ...
- 初始化mysql数据库时提示字符编码错误的解决办法
有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...
- 2017.10.25 Java List /ArrayList 三种遍历方法
java list三种遍历方法性能比较 学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入记录,然后遍历ArrayList,测试代码如下: pac ...
- xrdp 安装后 WINDOWS远程登录出错
xrdp需要vnc作为基础服务, sudo apt-get install tightvncserver 树莓派上这个命令运行下再连就好了