注册
 找回密码
 注册
江西广告网
查看: 291|回复: 0
打印 上一主题 下一主题

JAVA基础应用:

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2008-12-30 11:14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
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]--; } } } }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表