欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap 谈天说地
   您现在位于: 首页技术专栏开发语言 → 正文
排序算法JAVA实现
07-10-10 08:49:57 作者:半块点心 出处:本站原创
希尔排序算法的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]--;

 }

}

 }

}
public class InsertSort implements SortStrategy

{

       /**

       *利用插入排序算法对obj进行排序

       */

       public void sort(Comparable []obj)

       {

              if (obj == null)

              {

                     throw new NullPointerException("The argument can not be null!");

              }

 

              /*

              *对数组中的第i个元素,认为它前面的i - 1个已经排序好,然后将它插入到前面的i - 1个元素中

              */

              int size = 1;

              while (size < obj.length)

              {   

                  insert(obj, size++, obj[size - 1]);

              }

       }

 

       /**

       *在已经排序好的数组中插入一个元素,使插入后的数组仍然有序

       *@param obj 已经排序好的数组

       *@param size 已经排序好的数组的大小

       *@param c 待插入的元素

       */

       private void insert(Comparable []obj, int size, Comparable c)

       {

              for (int i = 0 ;i < size ;i++ )

              {

                     if (c.compareTo(obj[i]) < 0)

                     {

                            System.out.println(obj[i]);

                            //如果待插入的元素小于当前元素,则把当前元素后面的元素依次后移一位

                            for (int j = size ;j > i ;j-- )

                            {

                                   obj[j] = obj[j - 1];

                            }

                            obj[i] = c;

                            break;

                     }

              }

       }

}
package Utils.Sort;


/**

*@author Linyco

*利用冒泡排序法对数组排序,数组中元素必须实现了Comparable接口。

*/

public class BubbleSort imp
9 7 3 1 2 3 4 4 8 :

(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  

    关于我们 友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.

                   滇ICP备05006901号