赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

JAVA基础应用: 如何实现希尔排序算法

发布时间:2007.03.27 01:57     来源:赛迪网技术社区    作者:cyber3

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]--;

}

}

}

}

(t006)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· JAVA基础应用: 处理Java中的日期问题 (03-26) · 教程:比较Java EE 5平台和J2EE 1.4平台 (03-26)
· JAVA应用: 浮点数转化为大写中文金额 (03-26) · Riijj Crackme10 Anniversary算法简析 (03-19)
· 密码知识系列之基于J2ME的MD5算法类 (03-05) · 最强加密算法MD5被破译后我们怎么办 (03-01)
· 谈谈在Oracle下开发JAVA程序的问题 (01-08) · JAVA基础:提升JSP应用程序的七大绝招 (09-26)
· JAVA基础:JDBC优化数据库连接 (09-26) · 在Java中应用设计模式-Factory Method (09-08)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 工信部“三定”公布 总编制731名设24司局
· 北京发电子商务监管意见 营利性网店须办照
· 直播 08中国城市信息化高峰论坛 案例点评
· 烽火网络校园解决方案 移民安置信息管理系统
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统