RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

希尔排序算法的JAVA实现_领先的中文.网站

来源: 作者: 时间:2007-05-25 点击:

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) + 19 * 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]--;

数据挖掘研究院

数据挖掘研究院

数据挖掘研究院

} } } } 数据挖掘研究院



最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?