【插入排序】
来源:互联网 发布:java如何做一个表格 编辑:程序博客网 时间:2024/06/07 23:33
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
1.原理:
该方法实质上是一种分组插入方法
比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。
算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
给定实例的shell排序的排序过程假设待排序文件有10个记录,其关键字分别是:49,38,65,97,76,13,27,49,55,04。增量序列的取值依次为:5,2,1[3]
2.稳定性
由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。
3.应用:
希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(
)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。 原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
4,代码
while
(
true
){
for
(
int
i=
0
;i<d;i++){
for
(
int
j=i;j+d<a.length;j+=d){
int
temp;
if
(a[j]>a[j+d]){
temp=a[j];
a[j]=a[j+d];
a[j+d]=temp;
}
}
}
if
(d==
1
){
break
;}
d--;
}
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 函数式接口
- 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
- 测试Protobuffer的定义格式对其时间和空间的影响
- 分治算法
- 设计模式(8)——命令模式(Command Pattern,行为型)
- 【插入排序】
- 一个Gson处理工具类
- hbase建表
- 系统集成项目管理工程师教程知识点总结5
- ubuntu搭建Android NDK环境与Android Studio简单使用NDK
- [C] 编写一个统计空格、制表符与换行符个数的程序1-8
- MySql类型与Java类型
- jQuery 链式编程/隐式迭代/each方法/多库共存
- JSP自定义不带属性和标签体的简单标签