排序-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实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
随机推荐
- 关于node不需要重启即可刷新页面
之前写node程序每次修改后台代码都需要重新node xxx.js重启该文件,但是发现有一个supervisor的模块可以解决这个问题,需要npm install -g supervisor一下,然后 ...
- Activity的Theme主题风格
在AndroidManifest.xml文件里面: <activity name="test" android:theme="@andr ...
- COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落
★★☆ 输入文件:ThefallingofZLX.in 输出文件:ThefallingofZLX.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 正当革命如火如 ...
- java研发常见问题总结2
1. String.StringBuffer与StringBuilder之间区别 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 ...
- 将Apache2.4手动安装成Windows的服务
将Apache2.4手动安装成Windows的服务 可以选择在安装Apache时自动将其安装为一个服务.如果选择"for all users",那么Apache将会被安装为服务. ...
- [Linux发行版] 常见Linux系统下载(转)
本专题页汇总最受欢迎的Linux发行版基本介绍和下载地址,如果您是一位刚接触Linux的新手,这里的介绍可能对您有所帮助,如果您是以为Linux使用前辈,也可以在评论处留下您宝贵意见和经验,以便让更多 ...
- Jmeter启动错误
错误一 1 apache-jmeter-2.13\bin>jmeter 'findstr' 不是内部或外部命令,也不是可运行的程序 或批处理文件. Not able to find Java e ...
- python spark wingide
- undefined reference to 'dlopen';undefined reference to 'dlclose';undefined reference to 'dlerror'等问题
在linux下,编译链接的时候,经常会遇到这样一个问题,undefined reference to.....,引起这个问题的原因在于在链接的时候缺少选项.下面举几个例子,并给出解决办法. 1. u ...
- 【洛谷P1323】删数问题
删数问题 题目链接 首先找出最小的k个数:用堆每次取出最小的元素p,将p*2+1和p*4+5压入堆. 贪心求最大数:从前往后找第一个data[j+1]>data[j],删除data[j].(链表 ...