希尔排序(Shell)

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

就是直接插入排序的升级版,可以和直接插入排序进行对比,就比较容易理解。

1.固定增量r,每次除2

/*
	 * shell排序
	 * 希尔排序 直接插入排序的升级版*/
	static void shellSort(int[] a){
		int j,i,h;
		int r,temp;
		int x=0;
		for(r= a.length/2;r>=1;r/=2){
			for(i =r ;i<a.length;i++){
				temp = a[i];
				j = i-r;
				while(j>=0 && temp<a[j]){
					a[j+r]=a[j];
					j -= r;
				}
				a[j+r]=temp;

			}
			x++;
			System.out.println("第"+x+"步排序结果:");
			for(h = 0;h<a.length;h++){
				System.out.print(""+a[h]+" ");
			}
			System.out.println("\n");
		}
	}

  2.自定义增量数组:int[] dlta= new int[]{3,2,1},这个数组自定义,数量视实际情况而定。

static void ShellInsert(int[] a,int dk){
		int i,j;
		for(i = dk+1;i<a.length;i++){
			if(a[i]<a[i-dk]){  //需要插入
				a[0]=a[i];
				for(j = i-dk;j>0&&a[0]<a[j];j-=dk)
					a[j+dk]=a[j];     //记录后移寻找插入位置
				a[j+dk]=a[0];

			}

		}

	}
	 static void ShellSort(int a[],int dlta[],int t){
		 //按增量序列dlta[0。。t-1]对顺序表L作希尔排序

		 for(int k=0;k<t;k++)
			 ShellInsert(a,dlta[k]);
	 }

     public static void main(String[] args){

   int[] array  = new int[]{22,55,45,18,40,8,36};
		int[] dlta= new int[]{3,2,1};
		//shellSort(array);
		ShellSort(array,dlta,3);
    for(int i=0;i<array.length;i++)
			System.out.print(array[i]+" ");

  }

  

时间: 2024-12-17 05:31:34

希尔排序(Shell)的相关文章

希尔排序Shell sort

希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每隔3个数取一个,每隔三个再取一个,这样取出来的数

数据结构 - 希尔排序(Shell&amp;#39;s Sort) 具体解释 及 代码(C++)

数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24363981 希尔排序(Shell's Sort), 又称"缩小增量排序"(Diminishing Increment Sort), 是插入排序的一种. 主要思想是: 先将整个记录, 通过间隔分成若干个子序列, 分别进行插入排序, 待整个序列基本有序时, 再进行一次插入排序. 由于插入排

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

希尔排序 Shell Sort

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中:然后,对各组内的元素进行直接插入排序. 这一趟排序完成之后,每一个组的元素都是有序的.然后减小gap的值,并重复执行上述的分组和排序.重复这样的操作,当gap

希尔排序(shell)理论---不含源码

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 希尔排序,是一个缩小增量排序.它根据步长来进行排序,步长不同可能会产生不同的序列,但是他们的最终结果是相同的,希尔排序的官方理论难以理解,这里就用非官方的解释来阐述. 原理: >1.加入有n个节点的序列,假设希尔排序的步长i,那么我们第一步就是将这n个节点,每隔i个座位为一组,如下所示(步长i要取好): [n1, n1+i] [n2, ni+2] [...........] [nx, nn] >2.然后每一组两两比较,如n1和n1+

排序之希尔排序(shell sort)

前言 本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此:一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助. 前提故事 骚年在上次与博主进行了直接插入排序的讨论后,找到了博主,说:“博主,对于直接插入排序,我有重大的发现”,博主想了想,就问:“什么发现?”,骚年:“我发现了如下两点” 1)当序列的个数比较少时,直接插入排序效率高:这个好理解,个数

希尔排序(Shell Sort)

1.定义 希尔排序(Shell Sort)是插入排序的一种.因D.L.Shell于1959年提出而得名. 2.基本思想 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 该方法实质上是一种分组插入方法. 3.Shell排序算法实现 (1

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(