`
zhaohaolin
  • 浏览: 1016285 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

希尔排序算法的JAVA实现

阅读更多

package Utils.Sort;  
  
/** 
 
*希尔排序,要求待排序的数组必须实现Comparable接口 
 
*/  
  
public class ShellSort implements SortStrategy  
  
{ private int[] increment;  
  
/** 
 
*利用希尔排序算法对数组obj进行排序 
 
*/  
  
public void sort(Comparable[] obj)  
  
{ if (obj == null)  
  
{ throw new NullPointerException("The argument can not be null!");  
  
}  
  
//初始化步长  
  
initGap(obj);  
  
//步长依次变化(递减)  
  
for (int i = increment.length - 1 ;i >= 0 ;i-- )  
  
{ int step = increment[i];  
  
//由步长位置开始  
  
for (int j = step ;j < obj.length ;j++ )  
  
{ Comparable tmp;  
  
//如果后面的小于前面的(相隔step),则与前面的交换  
  
for (int m = j ;m >= step ;m = m - step )  
  
{ if (obj[m].compareTo(obj[m - step]) < 0)  
  
{ tmp = obj[m - step];  
  
obj[m - step] = obj[m];  
  
obj[m] = tmp;  
  
}  
  
//因为之前的位置必定已经比较过,所以这里直接退出循环  
  
else  
  
{ break;  
  
} } } }  
  
}  
  
/** 
 
*根据数组的长度确定求增量的公式的最大指数,公式为pow(4, i) - 3 * pow(2, i) + 1和9 * pow(4, i) - 9 * pow(2, i) + 1 
 
*@return int[] 两个公式的最大指数 
 
*@param length 数组的长度 
 
*/  
  
private int[] initExponent(int length)  
  
{ int[] exp = new int[2];  
  
exp[0] = 1;  
  
exp[1] = -1;  
  
int[] gap = new int[2];  
  
gap[0] = gap[1] = 0;  
  
//确定两个公式的最大指数  
  
while (gap[0] < length)  
  
{ exp[0]++;  
  
gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);  
  
}  
  
exp[0]--;  
  
while (gap[1] < length)  
  
{  
  
exp[1]++;  
  
gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);  
  
}  
  
exp[1]--;  
  
return exp;  
  
}  
  
private void initGap(Comparable[] obj)  
  
{ //利用公式初始化增量序列  
  
int exp[] = initExponent(obj.length);  
  
int[] gap = new int[2];  
  
increment = new int[exp[0] + exp[1]];  
  
//将增量数组由大到小赋值  
  
for (int i = exp[0] + exp[1] - 1 ;i >= 0 ;i-- )  
  
{ gap[0] = (int)(Math.pow(4, exp[0]) - 3 * Math.pow(2, exp[0]) + 1);  
  
gap[1] = (int)(9 * Math.pow(4, exp[1]) - 9 * Math.pow(2, exp[1]) + 1);  
  
//将大的增量先放入增量数组,这里实际上是一个归并排序  
  
//不需要考虑gap[0] == gap[1]的情况,因为不可能出现相等。  
  
if (gap[0] > gap[1])  
  
{ increment[i] = gap[0];  
  
exp[0]--;  
  
} else  
  
{ increment[i] = gap[1];  
  
exp[1]--;  
  
} } } }
 
分享到:
评论

相关推荐

    分别使用Java和Python实现希尔排序算法

    希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:分别使用Java和Python实现希尔排序算法 希尔排序:...

    希尔排序算法原理及其Java实现详解

    内容概要:本文详细介绍了希尔排序(Shell Sort)算法的工作原理及其实现。希尔排序是一种改进的插入排序算法,通过对...阅读建议:建议结合示例代码逐步调试,理解每一步的逻辑,从而更好地掌握希尔排序算法的精髓。

    希尔排序算法Java简单解释

    在Java中实现希尔排序,我们可以定义一个希尔排序的函数,接受一个整型数组作为参数,然后按照上述步骤进行排序。代码如下: ```java public class ShellSort { public static void sort(int[] arr) { int len = ...

    各种排序算法比较(java实现)

    `Algorithm.java`文件可能包含了这些排序算法的Java实现代码,而`常见排序算法的实现与性能比较.doc`文档则可能详细比较了这些算法的性能和适用场景。`readme.txt`文件可能是对整个项目的简要说明,包括如何运行和...

    常用的排序算法(java实现),附带一个PPT动画演示、详解了其中三种

    这里我们主要关注Java实现的排序算法,并结合一个PPT的动画演示来探讨其中的插入排序、直接插入排序和希尔排序。 首先,让我们深入理解插入排序。插入排序是一种简单的排序算法,其基本思想是将未排序的元素逐个...

    各种排序算法java实现

    在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...

    希尔排序java代码

    Java代码实现希尔排序的过程通常包括以下步骤: 1. 定义增量序列:首先定义一个增量序列,例如初始值为n/2,然后每次减半,直到增量为1。 2. 分组排序:对于每个增量,将数组分为若干个子序列,每个子序列包含增量...

    内部排序算法java实现

    这里我们将深入探讨Java实现的几种内部排序算法,包括希尔排序、快速排序、堆排序、归并排序、冒泡排序、插入排序和选择排序。 首先,希尔排序是一种基于插入排序的算法,通过将原始数组分解成多个子序列来提高效率...

    希尔排序(java)

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

    Java实现希尔排序算法(源代码)

    ### Java实现希尔排序算法 #### 实现原理 希尔排序(Shell Sort)是插入排序的一种高效改进版本,也称为缩小增量排序。它的基本思想是:先将整个待排序的记录序列分割成为若干子序列(由相隔某个“增量”的记录...

    希尔排序的Java实现方法ShellSort

    希尔排序的Java实现方法ShellSort,简单易懂,适合算法初学者。

    IT面试笔试-各种排序算法Java实现

    【IT面试笔试中的排序算法Java实现】 在IT面试和笔试中,掌握各种排序算法的实现是必不可少的技能。本文将详细介绍几种经典的排序算法,并提供Java语言的实现代码,包括冒泡排序、插入排序、选择排序和快速排序。...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    本篇文章将详细讲解标题中提到的六种常见排序算法的Java实现。 1. **冒泡排序**:冒泡排序是最基础的排序算法之一,它通过不断交换相邻的逆序元素来逐渐将较大的元素“浮”到数组的前端。在Java中,冒泡排序的基本...

    各类排序算法java的实现

    希尔排序的Java实现如下: ```java public class ShellSort implements SortUtil.Sort{ public void sort(int[] data) { for(int i = data.length / 2; i &gt; 2; i /= 2) { for(int j = 0; j ; j++) { insertSort...

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

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

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

    在`AlgorithmShellSort.java`这个文件中,我们可以预期看到希尔排序的具体实现。通常,Java代码会包含一个名为`shellSort()`的函数,它接收一个整数数组作为参数,并对其进行希尔排序。以下是希尔排序的基本步骤: ...

    插入,选择排序的链表实现及快速,希尔,冒泡排序算法实现合集

    这里我们主要探讨的是五种不同的排序算法:插入排序、选择排序、快速排序、希尔排序以及冒泡排序,它们都有对应的链表实现。让我们逐一深入理解这些算法。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观...

Global site tag (gtag.js) - Google Analytics