直接插入排序(顺序插入排序)

  基本思想:

  排序过程,整个排序过程为n-1趟插入,即先将序列中的第1个元素看成是一个有序子序列,然后从第2个元素开始,逐个进行插入,直至整个序列有序。

  在有序序列中插入一个元素,保持序列是有序的,不断增长这个有序序列完成排序

  就类似将成绩单上的第一个同学的名字和成绩学到旁边一张白纸中央,如果第二个同学比他成绩高,就写到第一个同学的上方,如果比他低,就写到下方。等看到第三个同学的成绩后,根据他的成绩与前两个同学成绩比较,插入到相应的位置。比如他的成绩正好在两个同学之间,就在傍边那张纸上,把他的名字插入到前两个人之间。当然,那张排序的张要留够足够的空白,方便插入后来的同学名字。

  

    public static void Insert_sort(int[] a)
{
for (int i = ; i < a.Length; i++)
{
int temp = a[i]; //将待排序的数组存入临时变量
int j;
for (j = i - ; j >= && temp<a[j]; j--)
{
a[j + ] = a[j]; //将小的数值往后移
}
a[j + ] = temp; //将未排序的数字插入到相应的位置
}
   }

折半插入排序(二分插入排序)

  基本思想:

  折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法:

  把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素;排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程。

    public static void BinaryInsertSort(int[] arr)
{
for (int i = ; i < arr.Length; i++) //依次从第1个元素到第n个元素插入到有序序列中
{
int temp = arr[i]; //将待排序的数值赋值给一个变量
int mid = ; //有序序列数组的中间位置
int low = ; //有序序列中的第一个元素
int high = i-; //有序序列中的第最后个元素
//采用二分法在有序的的数组序列中不断循环找到合适的插入位置
while (low <= high)
{
mid = (low + high);//计算出中间位置
//如果待排序的数值小于中间值则在左半部分查找插入位置
//否则在右半部分查找插入位置
if (temp < arr[mid])
{
high = mid - ;
}
else
{
low = mid + ;
}
}
//将需要移动的数组向后移
for (int j = i - ; j < high + ; j--)
{
arr[j + ] = arr[j];
}
//需要插入的下标位置,i待排序的下标位置
if (low != i)
{
arr[low] = temp;
}
}
}

希尔插入排序(缩小增量排序

  基本思想:

  1. 假设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。
  2. 由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
  3. 关于希尔排序increment(增量)的取法增量increment的取法有各种方案。最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。应用不同的序列会使希尔排序算法的性能有很大的差异。 
        static void shell_sort(int[] arr)
{
int d=(arr.Length)/;
while(d>=)
{
for(int i=d;i<arr.Length;i++)
{
int temp=arr[i];
int j=i-d;
//直接插入排序,会向前找所适合的位置
while(j>=&&arr[j] >temp)
{
//交换位置
arr[j+d]=arr[j];
j=j-d;
}
arr[j+d]=temp;
}
d/=;
}
}

随机向数组中存入10万个元素比较耗时。

有关测试结果

直接插入排序:

折半插入排序:

希尔排序:

插入排序(直接插入、折半、Shell)的更多相关文章

  1. 基本排序(二)插入排序(直接插入、Shell、折半)

    插入排序是常见的内部排序之一.常见的插入排序包括直接插入排序.Shell排序.折半排序.本篇主要介绍这三个排序. 转载请注明出处——http://www.cnblogs.com/zrtqsk/p/38 ...

  2. 直接插入排序、折半插入排序、shell插入排序

    直接插入排序:   折半插入排序:   shell插入排序:  

  3. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

  4. 插入排序专题 直接插入 折半 希尔shell

    1.直接插入排序 分析:a[n]有n个元素 a[0...n-1]  从 i=1...n-1  a[i]依次与   a[0...n-2]数字进行比较 发现后面的数字大于前面的数字交换位置,每一次比较,与 ...

  5. 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

    一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...

  6. 新年在家学java之基础篇--循环&数组

    因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...

  7. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  8. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  9. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

随机推荐

  1. java -jar 执行jar包出现 java.lang.NoClassDefFoundError

    我用idea工具将自己开发java程序打成一个可执行的jar包,当然用eclipse或者直接用jar命令行都无所谓,本质都是将程序归档到一个压缩包,并附带一个说明清单文件. 打jar的操作其实很简单, ...

  2. 开源自然语言处理工具包hanlp中CRF分词实现详解

     CRF简介 CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题. [gerative-discriminative.png] CRF训练 这类耗时的任务,还 ...

  3. hadoop 2.7.1安装和配置

    一.安装环境 硬件:虚拟机 操作系统:Centos 6.4 64位 IP:192.168.241.128主机名:admin安装用户:root 二.安装JDK 安装JDK1.7或者以上版本.这里安装jd ...

  4. 基于spring的placeholder思路处理配置信息敏感信息加密解密的实践

    基于Spring的placeholder处理思路,实现系统配置信息敏感信息的加密解密处理. 我们的处理方案,是基于类org.springframework.beans.factory.config.P ...

  5. 基于tensorflow的MNIST手写识别

    这个例子,是学习tensorflow的人员通常会用到的,也是基本的学习曲线中的一环.我也是! 这个例子很简单,这里,就是简单的说下,不同的tensorflow版本,相关的接口函数,可能会有不一样哟.在 ...

  6. 【java】数据类型

    逻辑型boolean: boolean类型数据只能取值True或False,不可以0或者非0替代True或False,这点与c语言不同. 字符型char: 一个char类型的字符占两个字节.一个汉字也 ...

  7. 具有 Button 风格的 Panel

    unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. HAAR小波

    HAAR小波分解信号或图像的“平滑”部分和“变化”部分(也许所有小波都这样?). 比如信号[1 2 3 4 5 6 7 8] 分解后(不考虑系数): [1.5 3.5 5.5 7.5]         ...

  9. 【springBoot】之配置文件application

    springboot使用一个全局的配置文件application.properties或者是application.yml,放在在src/main/recesources下或者在类路径下的/confi ...

  10. go中的make和new的区别

    适用范围:make 只能创建内建类型(slice map channel), new 则是可以对所有类型进行内存分配 返回值: new 返回指针, make 返回引用 填充值: new 填充零值, m ...