`

重走算法路之希尔排序

 
阅读更多

        希尔排序是在插入排序的基础上对插入排序进行了优化。我们知道插入排序的过程是将后面的要排序的数字依次和待排序前面的数字进行比较,然后判断大小,最后在进行交换。

        这就存在一个很大的问题,就是如果最小的数字在最右边的话,按照我们排序的要求(顺序排列)这个最小的数字要依次和前面的n-1个数字进行比较,然后复制交换,所以插入排序的最大的缺点就是复制的次数过多。

        实际上我们可以在直接进行插入排序之前对数据进行“处理”,所谓的“处理”就是让数据变得有序一些,不那么随机化,希尔排序也就做了这样一件事情,使用了一个“增量”,用这个“增量”来对待排序的数组进行分组(比如对10个数据进行排序,按照增量为4来分,就可以分别对下标为(0,4,8)(1,5,9)的两组数据进行小规模的排序)在这个小的规模的数组中采用直接插入排序的方法将小的数组排好序,然后将增量减小,再重复进行,最后当增量减小到1的时候就进行最后的一次排序,和我们以前的插入排序是一样的方法,只不过这次插入排序是在经过我们前面处理之后才进行的,进过前面的处理,数据基本上已经达到了有序了,所以在最后一次进行插入排序的时候复制量就减小了很多,大大的提高了效率,时间效率虽然不及快排,但是比直接插入排序还是快了很多。

        代码:

package 希尔排序;

/**
 * 希尔排序
 * 
 * @author TMs
 * 
 */
public class ShellSort {
	public static int count = 0;

	public static void main(String[] args) {

		int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
		print(data);
		shellSort(data);
		print(data);

	}

	public static void shellSort(int[] data) {
		// 计算出最大的h值
		int h = 1;
		while (h <= data.length / 3) {
			h = h * 3 + 1;
		}
		while (h > 0) {
			for (int i = h; i < data.length; i += h) {
				if (data[i] < data[i - h]) {
					int tmp = data[i];
					int j = i - h;
					while (j >= 0 && data[j] > tmp) {
						data[j + h] = data[j];
						j -= h;
					}
					data[j + h] = tmp;
					print(data);
				}
			}
			// 计算出下一个h值
			h = (h - 1) / 3;
		}
	}

	public static void print(int[] data) {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + "\t");
		}
		System.out.println();
	}

}

  

     打印输出结果:

  

5	3	6	2	1	9	4	8	7	
1	3	6	2	5	9	4	8	7	
1	2	3	6	5	9	4	8	7	
1	2	3	5	6	9	4	8	7	
1	2	3	4	5	6	9	8	7	
1	2	3	4	5	6	8	9	7	
1	2	3	4	5	6	7	8	9	
1	2	3	4	5	6	7	8	9	

  

  • 大小: 44.6 KB
2
0
分享到:
评论
2 楼 MNTMs 2014-05-24  
bitray 写道
是重不是从。。。

谢谢 代码不好,语文也退步了
1 楼 bitray 2014-05-24  
是重不是从。。。

相关推荐

    算法可视化系列——排序算法——希尔排序

    希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组...对于学习和理解排序算法,希尔排序是不可或缺的一部分。

    C语言实现希尔排序算法

    希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的基本思想是将待排序的元素按照...在C语言中,希尔排序通常作为一个基础的排序算法实现,用于教学和理解排序算法的原理。

    suanfa.rar_Dijkstra radix_KMP算法演示_希尔排序

    1、实现KMP模式匹配算法、哈夫曼编码算法、由遍历序列恢复二叉树、Prim算法、Kruskal算法、Floyd算法、Dijkstra算法、拓扑排序、关键路径算法、二叉排序树生成算法(含平衡化)、哈希表生成及哈希查找算法、希尔排序...

    排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)

    排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...

    c++希尔排序算法实现源代码 原创

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后分别对子序列进行插入排序,最后再进行一次全局的插入...

    《快速排序 直接插入排序 堆排序 希尔排序 选择排序:五种排序》

    (1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...

    希尔排序算法Java简单解释

    希尔排序是一种比较实用的排序算法,虽然它不是稳定的排序算法(即相等的元素可能会改变原有的相对顺序),但其效率在许多情况下优于其他简单的排序算法,特别是在处理大规模数据时。在编程实践中,理解并掌握希尔...

    C#实现希尔排序算法.

    尽管希尔排序不是稳定的排序算法(即相等的元素可能会改变原有的相对顺序),但其高效性和灵活性使其在实际应用中仍有一定价值。 在C#中实现希尔排序,首先需要理解C#的基本语法和数据结构。C#是一种面向对象的编程...

    C#算法 -- (三)希尔排序.doc

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的元素按照一定的间隔分组,对每组进行插入排序,然后逐渐减小间隔,直至间隔为1,完成整个序列的...

    C++实现希尔、快速、堆排序、归并排序算法

    Hoare在1960年提出,是目前应用最广泛的排序算法之一。它采用分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行...

    常用c++排序算法(包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等)

    各种常用c++排序算法,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、希尔排序等

    快速排序、选择排序、冒泡排序、希尔排序等6种排序算法C实现

    3. **冒泡排序**:冒泡排序是最简单的排序算法之一,通过比较相邻元素并交换不正确的顺序来实现排序。它的名字来源于每次遍历过程中,较小的元素就像气泡一样“浮”到数组的顶部。冒泡排序在最坏情况下的时间复杂度...

    希尔排序java代码

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的增量分组,对每组使用直接插入排序,然后逐渐减小增量,继续进行分组排序,直到增量...

    内部排序 希尔排序和直接插入排序的比较

    - **稳定性**:直接插入排序是稳定的排序算法,而希尔排序则不是。 - **适用场景**:对于较小的数据量或者部分有序的数据,直接插入排序可能更高效;而对于大数据量或无序数据,希尔排序更为适合。 通过上述实验,...

    7种常用排序算法实现(C++)(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序)

    冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序。如果前一个元素大于后一个元素,它们就会交换位置,这样最大的元素会逐渐"冒泡"到序列末尾。时间复杂度为O(n^2)。 2...

    C语言实现希尔排序

    希尔排序(Shell Sort)是由Donald Shell于1959年提出的一种排序算法,它是对直接插入排序的一种改进。其基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体做法是:首先选择一个增量...

    希尔排序C语言实现

    希尔排序(Shell Sort)是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一个增量序列分成若干个子序列,然后对每个子序列进行插入排序,最后减小增量,重复这个...

    NlogN经典排序算法的实现-希尔排序,快速排序,归并排序.zip

    **希尔排序、快速排序与归并排序:NlogN经典排序算法详解** 排序算法是计算机科学中的基础且重要的一部分,尤其是在处理大量数据时,高效排序能够显著提升程序性能。本资料包聚焦于三类时间复杂度为O(nlogn)的经典...

    用C实现了排序算法中的插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序、桶排序、基数排序

    在这份文档中,我用C语言实现了排序算法的多种方法,包括插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序、桶排序和基数排序。这些算法可以帮助我们对数据进行有效的排序和整理,以便更好地处理和分析...

    希尔排序基本思想

    希尔排序是一种基于插入排序的快速排序算法,由Donald Shell在1959年提出。它的主要特点是通过将待排序的数组元素按照一定的间隔分组,然后对每组进行插入排序,随着间隔逐渐减小,直到间隔为1时,整个数组成为一个...

Global site tag (gtag.js) - Google Analytics