`
12616383
  • 浏览: 51682 次
  • 性别: Icon_minigender_1
  • 来自: 待定
社区版块
存档分类
最新评论

高级排序--希尔排序

J# 
阅读更多

希尔排序

 

实际上是基于插入排序的,在插入排序中相比较的是相邻的两个元素,但是如果一个很小的数在数组的最右端,而他本应该是在最左端的,这样的话所有中间的元素都要向右移动一位,并且执行了N次。希尔排序就是首先对大跨度的元素做比较并且进行移动,这样的久相对有序了,再在这个基础上进行普通的插入排序,效率就会高很多。

 

效率

 

快速排序>希尔排序>简单排序

希尔排序在最坏的执行效率上和平均的执行效率上没有差很多。

 

<!--StartFragment --> 

 

public class ShellSort {
	
	public static void main(String[] args) {
		int[] arr = {4,5,9,3,2,1,6,18,11,15,10};
		
		ShellSort.display(arr);
		ShellSort.shellSort(arr);
		System.out.println("------------------------------");
		ShellSort.display(arr);
	}
	
	public static void display(int[] theArray){
		int nElems = theArray.length;
		System.out.println("A=");
		for(int j = 0; j < nElems; j++){
			System.out.println(theArray[j] + " ");
		}
		System.out.println(" ");
	}
	
	public static void shellSort(int[] theArray){
		int inner,outer;
		
		//临时变量
		int temp;
		
		//数组长度
		int nElems = theArray.length;
		
		//定义元素跨度数量
        int h=1;       

        //定义元素跨度基数   
        int n = 3;
        
        /**
         * 设置排序元素之间的位置 公式:h = h * n +1
         * 例:n=3 则元素跨度为(0,4),(1,5),(2,6)...
         *   n=4 -->(0,5),(1,6),(2,7)...
         */
        while(h<=nElems/n){
        	  h=h*n+1;    //1,4,13,40,121,...   
        }
         
        while (h>0){
        	
        	/**
        	 * 这里的for循环会执行2次
        	 * 第一次:  h=4 以元素跨度个数为4的情况下循环一次(0,4),(1,5),(2,6)
        	 * 第二次:  h=1 也就执行插入排序对相邻的元素进行比较
        	 */
	        for(outer=h;outer<nElems;outer++){
	        		
	        		/**
	        		 * 存储基数 outer = h 位置的元素,每次outer++,比较的元素
	        		 * 位置也就向后移动一位0,4),(1,5)
	        		 * 移动的次数  数组长度 - h;
	        		 */
	                temp=theArray[outer];   
	                inner=outer;   
	               
	              /**
	               * 如果已经替换条件成则立进行替换
	               */
	              while(inner>h-1&&theArray[inner-h]>=temp){   
	                theArray[inner]=theArray[inner-h];
	                
	                //已经替换后,变更inner值,为首元素(0,4)中的0,(1,5)中的1
	                inner-=h;   
	                }
	            //将换后的临时值替换位置
	            theArray[inner]=temp;   
	        }
	        
	        //关键:这里将元素基数变为1,也就将这个运算变为了插入排序。
            h=(h-1)/n;   
         }   
     }   
}

 

分享到:
评论

相关推荐

    C语言版的排序方法---希尔排序.docx

    希尔排序的时间复杂度一般认为是O(n^1.3),优于简单的插入排序的O(n^2),但比其他高级排序算法如快速排序或归并排序的时间复杂度要高。不过,希尔排序在处理部分有序的数组时表现良好,因此在某些特定场景下仍然是一...

    排序 冒泡 插入 希尔

    希尔排序的时间复杂度通常比冒泡排序和插入排序要好,但不如更高级的排序算法如快速排序,其平均时间复杂度介于O(n)到O(n^2)之间,具体取决于选择的增量序列。 **快速排序(Quick Sort)** 虽然标题中没有提及,但...

    希尔排序java代码

    总结,希尔排序是介于简单排序与高级排序之间的一种算法,通过合理设计增量序列,可以在一定程度上提升排序速度,适合处理大数据量的排序问题。在实际编程中,根据数据特点选择合适的增量序列是优化希尔排序的关键。

    快速排序 希尔排序 插入排序 折半排序算法

    - 由于其简单性,插入排序常用于其他高级排序算法的基础。 4. **折半排序(Binary Insertion Sort)**: - 折半插入排序是插入排序的一个变体,它在插入元素时使用二分查找来确定插入位置,从而减少比较次数。 -...

    数据结构之希尔排序算法程序

    希尔排序由于其独特的排序方式,尤其适用于大规模数据的排序,虽然在某些情况下可能不如其他高级排序算法(如快速排序、归并排序等)效率高,但在特定条件下,如接近有序的序列,其表现往往优于其他简单排序算法。

    数据结构——希尔排序

    总的来说,希尔排序是一种改进的插入排序,通过增量策略优化了插入排序在处理大规模数据时的效率,适用于需要快速排序但又无法使用更高级排序算法的情况。在实际编程中,希尔排序常常作为其他复杂排序算法的备选方案...

    C# 排序算法大全参考资料,比较清淅的一个版本。集中介绍了C#中的冒泡算法、选择排序、插入排序、希尔排序等常用算法,并包含示例代码和注意事项等。

    本文将深入探讨C#中常见的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序,以及它们的实现细节和应用场合。 首先,我们来看**冒泡排序**。冒泡排序是一种简单的交换排序方法,它通过不断比较相邻元素并交换...

    数据结构希尔排序

    ### 数据结构之希尔排序 #### 一、希尔排序概述 希尔排序(Shell Sort)...通过对希尔排序的深入理解与实践,可以更好地掌握这种排序方法的核心思想和实现细节,为进一步学习更高级的数据结构和算法打下坚实的基础。

    希尔排序算法

    在实际应用中,希尔排序通常用于对中等大小的数据集进行排序,因为对于小数据集,插入排序已经足够高效,而对于大数据集,更高级的排序算法如快速排序或归并排序可能会有更好的表现。希尔排序的优点在于其简单性和可...

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

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

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

    希尔排序是一种基于插入排序的快速排序算法,由Donald Shell于1959年提出。它通过将待排序的数组元素按某个增量分组,然后对每组进行直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,...

    C语言版的排序方法---插入排序.docx

    - 虽然插入排序在处理大数据集时效率不如其他高级排序算法(如快速排序、归并排序等),但在小规模数据或部分有序的数据中,插入排序有很好的性能。 - 在实际编程中,插入排序也常用于其他算法的组成部分,比如...

    数据结构实验——排序

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

    各种排序算法 希尔排序 冒泡排序等

    希尔排序的时间复杂度通常比冒泡排序更快,但不如其他高级排序算法。 6. **直接插入排序**:直接插入排序是将每个元素与已排序的部分进行比较,找到合适位置插入。对于小规模或部分有序的数据,插入排序效率较高,...

    六种基本排序算法,堆,归并,希尔,快速排序等

    这里我们将深入探讨六种基本的排序算法:冒泡排序、插入排序、选择排序、希尔排序、堆排序以及归并排序,这些都是快速排序算法的基础。下面,我们将逐一介绍这些算法的工作原理、效率特点及其应用场景。 1. **冒泡...

    三种排序-SHELL,快速,堆

    这里我们关注的是三种常见的排序算法:希尔排序(Shell Sort)、快速排序(Quick Sort)和堆排序(Heap Sort)。这些算法各有特点,适用于不同的场景,理解和掌握它们对于提升编程能力非常有帮助。 首先,希尔排序...

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

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

    C#中 8种初级+高级排序方法

    这里我们将探讨8种在C#中实现的初级和高级排序方法,这些方法在数据结构和算法的学习中至关重要。以下是每种排序方法的详细介绍: 1. **冒泡排序 (Bubble Sort)** 冒泡排序是最简单的排序算法之一,它通过重复遍历...

    排序算法 -- 插入排序

    在实际应用中,插入排序通常用于小规模数据或者作为其他高级排序算法(如快速排序、归并排序)的基石,特别是在处理部分有序的数据时,它的表现往往优于其他O(n^2)的排序算法。同时,插入排序也可以用于构建更复杂的...

    河北工业大学-数据结构实验报告-内部排序算法效率比较平台的设计与实现.doc

    - 掌握多种排序算法的基本思想,例如直接插入、冒泡、简单选择、快速、堆和希尔排序。 - 能够使用高级语言实现这些排序方法。 **实现提示** - 需要在已知算法的适当位置插入计数逻辑来统计比较和移动次数。 - 应...

Global site tag (gtag.js) - Google Analytics