`

高级排序之希尔排序

 
阅读更多

希尔排序是1959年某个叫希尔的数学大大发明的,它其实就是在插入排序的基础上做了一些优化,但是效率却不知道提高了多少倍,我估计几万倍应该有吧(纯属个人瞎蒙)。插入排序是一个一个来插,而希尔排序则是有一个间隔,比如在容量为10的数组里将索引为1和3和5,7插入排序, 2和5,8插入排序。在这其中有一个增量的概念,可别以为这个增量是随便取的,如果取的不科学,可是效率也会大大的下降哦。最科学的取法就是 n = (n * 3)+1。 n是增量,初始值为1,按照这个公式一直增加到array.length / 3这个位置左右,然后在运算一次这个公式,就是最大的增量了。

package sort;

public class ShellSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 1000000;
		int[] arr = new int[n];
		for (int i = n; i > 0; i--) {
			arr[i - 1] = i;
		}
		shellSort(arr);
		/*for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}*/
	}

	/**我自己写的,效率要低一点。
	 * @param arr
	 */
	public static void shellSort(int[] arr){
		int len = arr.length;
		int h = 1;
		while(h <= len/3){
			h = (h * 3) +1;
		}
		while(h > 0){
			for (int i = 0; i < len; i++) {
				while(i + h < len && arr[i] > arr[i+h]){
					int temp = arr[i];
					arr[i] = arr[i+h];
					arr[i+h] = temp;
				}
			}
			h = (h - 1)/3;
		}
	}
	
	
	/**书上例子,效率较高。
	 * @param arr
	 */
	public static void shellSort3(int[] arr){
		int i,j,n=1,temp,len = arr.length;
		//获取最大增量值
		while(n<=len/3)
			n = n*3+1;
		//增量等于1时是最后一次排序
		while(n > 0){
			for (i = n; i < len; i++) {
				temp = arr[i];
				j = i;
				//按照增量插入排序,由后往前排,这样效率高,我写的由前往后排,做了一些无用功。
				while(j >= n && arr[j - n] >= temp){
					arr[j] = arr[j - n];
					j-=n;
				}
				arr[j] = temp;
			}
			//增量递减公式
			n = (n - 1)/3;
		}
	}
	
}
 在我机器上逆序排100w数据耗时44毫秒,快吧,比归并排序快多了,而且不需要额外空间。算法复杂度和代码量也比较优,快速排序复杂了一点(我是说如果写的更可能完美的情况下)代码量也多。虽然比快速排序稍慢一点点,但是综合其他,我感觉是排序的首选。专家也推荐一般情况下用希尔排序,如果你要更快一点点的话,才考虑快速排序。
分享到:
评论

相关推荐

    java高级排序之希尔排序

    主要介绍了java高级排序之希尔排序 ,需要的朋友可以参考下

    [Java算法-排序]希尔排序.java

    该资源提供了一份全面的指南,介绍了如何在Java中实现希尔排序。文档中涵盖了希尔排序的基本概念,包括如何对数组进行排序以及如何在Java中实现希尔排序。此外,文档还包括一个逐步指南,介绍如何在Java中实现希尔...

    高级排序 数据结构

    高级排序 数据结构 归并排序,堆排序,希尔排序,快速排序

    数据结构实验——排序

    一、实验目的 1、掌握排序的不同方法,并能用高级语言实现排序算法 二、实验内容 1、实现希尔排序算法。

    JS排序算法之希尔排序与快速排序实现方法

    本文实例讲述了JS排序算法之希尔排序与快速排序实现方法。分享给大家供大家参考,具体如下: 希尔排序: 定义一个间隔序列,例如是5,3,1。第一次处理,会处理所有间隔为5的,下一次会处理间隔为3的,最后一次处理...

    重庆邮电大学数据结构实验报告八排序

    通过实验,帮助学生由浅入深地掌握各种简单排序和高级排序的基本思想,让他们比较其性能,也让他们更好地理解希尔排序和快速排序的方法。 1.任意输入一个数组并利用简单选择排序算法对此数组的元素按从大到小的顺序...

    可视化排序之 - 希尔排序-易语言

    可视化排序之 - 希尔排序

    希尔排序算法的C语言实现示例

    主要介绍了希尔排序算法的C语言实现示例,希尔排序可以看作为一种高级的插入排序,需要的朋友可以参考下

    算法小节(排序)6种 低级到高级

    各种算法小节. 基本到高级.. 各种排序 冒泡 插入 选择 堆 希尔 等..

    易语言希尔排序之自定义数据类型排序-易语言

     ] 希尔排序之自定义数据类型排序 使用场景举例 : 例如 , 某班同学(假定数据类型数组为 , 数据类型[1].姓名 , 数据类型[2].年龄 ) , 需要按照年龄大小将同学座位排序... 需要按照出生先后将同学座位排序... 以下为...

    各种排序算法

    快速排序 归并排序 希尔排序掌握常用的排序方法,并掌握用高级语言实现排序算法的方法; 深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用; 了解各种方法的排序过程及其依据的原则,并掌握各种排序方法...

    php实现希尔排序算法的方法分析

    希尔排序(shell sort):希尔排序是基于插入排序的,区别在于插入排序是相邻的一个个比较(类似于希尔中h=1的情形),而希尔排序是距离h的比较和替换。 希尔排序中一个常数因子n,原数组被分成各个小组,每个小组由...

    希尔排序模块源码-10万超级列表框排序只花1秒-易语言

    希尔排序模块源码-10万超级列表框排序只花1秒 由于需要用到高效的超级列表框排序.就利用 汇编版的希尔排序 来写了一下超级列表框排序. 发现,从 取值- 排序- 显示 过程才花了 1秒 的时间.速度是七号排序的30倍,凌晨孤...

    C++ 基数排序的实现实例代码

    C++ 基数排序  大家好,今天带来的是自己...高级一些的有快速排序,希尔排序,堆排序,归并排序,基数排序等. 其中时间复杂度为O(n*logn)的算法有快速排序,归并排序和堆排序等,其中快速排序的使用最为广泛.时间复杂度为O

    Demo_Sort.zip

    基础排序算法中包括冒泡排序、选择排序与插入排序;高级排序算法中包括希尔排序算法、归并排序算法、堆排序算法、快速排序算法及改进快速排序算法、图论中的拓扑排序算法。

    面试常问的六大排序算法(代码+动画图解)

    文章目录初级排序算法选择排序插入排序希尔排序冒泡排序高级排序算法归并排序快速排序 初级排序算法 选择排序 动画演示 代码实现 public class selectSort { public static void main(String[] args) { int[] ...

    java数据结构与算法第二版

    第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和...

    Java数据结构和算法(第二版)

    第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大值和最小值 删除节点 ...

    algorithm:数据结构|数组队列堆栈链表哈希表堆字典树;算法|排序贪心动态规划分治回溯;欢迎给建议~~

    希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 递归 查找算法 贪心算法 分治算法 参考资料 JavaScript 算法与数据结构 中高级前端」窥探数据结构的世界- ES6 版 刷题训练指南 从头开始复习算法之让你...

    排序框架 简单/通用/类型安全/高效 面向对象/面向组件-易语言

    *本框架内部已实现了两个高效的排序算法组件:快速排序算法(递归实现虽然高效但大数据可能堆栈溢出)和希尔排序算法(效率稍低,但无堆栈溢出风险),开发者也可以通过继承“抽象排序算法”类,并实现2个简单的抽象方法...

Global site tag (gtag.js) - Google Analytics