插入排序(直接插入、折半、Shell)
直接插入排序(顺序插入排序)
基本思想:
排序过程,整个排序过程为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;
}
}
}
希尔插入排序(缩小增量排序)
基本思想:
- 假设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。
- 由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。
- 关于希尔排序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)的更多相关文章
- 基本排序(二)插入排序(直接插入、Shell、折半)
插入排序是常见的内部排序之一.常见的插入排序包括直接插入排序.Shell排序.折半排序.本篇主要介绍这三个排序. 转载请注明出处——http://www.cnblogs.com/zrtqsk/p/38 ...
- 直接插入排序、折半插入排序、shell插入排序
直接插入排序: 折半插入排序: shell插入排序:
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
- 插入排序专题 直接插入 折半 希尔shell
1.直接插入排序 分析:a[n]有n个元素 a[0...n-1] 从 i=1...n-1 a[i]依次与 a[0...n-2]数字进行比较 发现后面的数字大于前面的数字交换位置,每一次比较,与 ...
- 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...
- 新年在家学java之基础篇--循环&数组
因为“野味肺炎”的肆虐,过年被迫宅家只能吃了睡.睡了吃.这么下次只能长膘脑子空空,不如趁此机会重新学习java基础,为日后做铺垫~ 循环结构: 几种循环:for(::),while(){},do{}w ...
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- 排序算法三:Shell插入排序
排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...
- Java常见排序算法之折半插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
随机推荐
- JAVA面试-java虚拟机
1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的. 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...
- [NEWS]Microsoft expands partnerships with AOL and AppNexus, Bing to power search for AOL properties
http://advertising.microsoft.com/en/blog/33906/microsoft-expands-partnerships-with-aol-and-appnexus- ...
- STL基础--迭代器和算法
1 迭代器 Iterators 5种迭代器类型 随机访问迭代器: vector, deque, array // 允许的操作 vector<int> itr; itr = itr + 5; ...
- 使用Google cardboard 2的一些软件
最近入手cardboard2,FQ尝试了一些软件,特别分享,给大家提供一些方便. 链接:http://pan.baidu.com/s/1slehilZ 密码:b49h
- 学习笔记之DevOps
DevOps - Wikipedia https://en.wikipedia.org/wiki/DevOps DevOps (a clipped compound of "developm ...
- 第一天课程:第一个python程序print say hello
print("Hello World") linux下要加可执行权限 chmod 755 hello.py 权限755,7=4+2+1,4是读,2是写,1是执行,第一个7代表用户, ...
- [UE4]Grid Panel
一.使用Grid Panel可以做出类似暗黑3一样的物品栏:不同的物品栏占据的物品栏格子不一样. 二.GridPanel.FillRules,可以设置每个单元格内的控件是否是拉伸比重.注意:这个是Gr ...
- [UE4]UI动画复用
一.创建一个专门播放动画的Widget,添加一个“Name Slot”,创建动画绑定到这个“Name Slot”. 二.要使用这个动画的widget就添加第一步创建的widget,并把需要执行动画的对 ...
- bootstraptable学习(2)分页
1.分页需要配置一些参数 function init() { $('#bootstrapModel').bootstrapTable({ url: "../Listing.ashx" ...
- 结合源码分析 bubble 使用注意事项
使用dubbo时候要尽量了解源码,不然会很容易入坑. 一.服务消费端ReferenceConfig需要自行缓存 ReferenceConfig实例是个很重的实例,每个ReferenceConfig实例 ...