排序-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实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
随机推荐
- 微信小程序实战篇:基于wxcharts.js绘制移动报表
前言 微信小程序图表插件(wx-charts)是基于canvas绘制,体积小巧,支持图表类型饼图.线图.柱状图 .区域图等图表图形绘制,目前wx-charts是微信小程序图表插件中比较强大好使的一个. ...
- tween.js 插件
1.是什么? jQueryTween是一款轻量级的jQuery补间动画工具库插件.使用jQueryTween可以制作出各种平滑的动画过渡效果.该插件基于tween.js,旨在简化各种补间动画操作,提供 ...
- [转]C#利用委托跨线程更新UI数据
在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...
- System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值.解决办法是: 而这位大哥提出的解决办法 ...
- centos7.4 系统安装指导
centos7 系统安装指导 安装前规划 下载安装文件 安装过程设置 安装后系统基本设置 安装前规划 CentOS 7.x系列只有64位系统,没有32位. 生产服务器建议安装CentOS-7-x86_ ...
- 【Troubleshooting 】Outlook 客户端无法显示电子邮件图像
出于安全原因,Outlook 2013/2016不会在电子邮件中显示图像,但您可以右键单击图像并选择" 下载图片 "选项.我最近注意Outlook停止显示图像,并且没有下载图像的选 ...
- Anaconda上安装Tensorflow并在jupyter上运行
博客原文地址:https://blog.csdn.net/index20001/article/details/73555182 https://www.cnblogs.com/HongjianChe ...
- 整个trick
数据输入方面:1.image pyramid 图像金字塔.目前代码里是先选取一个scale,然后在每个GPU上按照scale读图片,相应的gt也更改."scales":[440, ...
- Task 的入门
https://www.cnblogs.com/huangxincheng/archive/2012/04/03/2430638.html
- eclipse 插件relo使用
1. eclipse插件安装 在线安装地址:http://relo.csail.mit.edu/update 本地配置,文件下载:http://download.csdn.net/download/s ...