找回密码

只需一步,快速开始

只需一步,快速开始

QQ登录

只需一步,快速开始

查看: 1074|回复: 0

java初学--希尔(Shell)法排序和数组排序

[复制链接]
发表于 2010-11-12 14:18 | 显示全部楼层 |阅读模式
java初学--希尔(Shell)法排序和数组排序

Java 私塾跟我学系列——JAVA 篇 网址:www.javass.cn

从前面介绍的冒泡排序法,选择排序法,插入排序法可以发现,如果数据已经大致排好序的时候,其交换数据位置的动作将会减少。例如在插入排序法过程中,如果某一整数 d不是较小时,则其往前比较和交换的次数会更少。如何用简单的方式让某些数据有一定的大小次序呢?Donald Shell(Shell 排序的创始人)提出了希尔法排序。

基本思路:先将数据按照固定的间隔分组,例如每隔 4 个分成一组,然后排序各分组的数据,形成以分组来看数据已经排序,从全部数据来看,较小值已经在前面,较大值已经在后面。将初步处理了的分组再用插入排序来排序,那么数据交换和移动的次数会减少。可以得到比插入排序法更高的效率。

示例如下:

  1. public class Test {
  2.    public static void main(String[] args) {
  3.       // 需要排序的数组,目前是按照升序排列的
  4.       int a[] = new int[5];
  5.       a[0] = 3;
  6.       a[1] = 4;
  7.       a[2] = 1;
  8.       a[3] = 5;
  9.       a[4] = 2;

  10.       // shell法排序
  11.       int j = 0;
  12.       int temp = 0;
  13.       //分组
  14.       for (int increment = a.length / 2; increment > 0; increment /= 2)
  15.          {
  16.          //每个组内排序
  17.          for (int i = increment; i < a.length; i++) {
  18.             temp = a;
  19.             for (j = i; j >= increment; j -= increment) {
  20.                if (temp < a[j - increment]){
  21.                   a[j] = a[j - increment];
  22.                }
  23.             }
  24.          }else{
  25.              break;
  26.          }
  27.       }
  28.       a[j] = temp;
  29.    }
  30. }

  31. // 检测一下排序的结果
  32. for (int i2 : a) {
  33.    System.out.println("i=" + i2);
  34. }
复制代码
运行结果:
i=1
i=2
i=3
i=4
i=5

如果你想要按照降序排列,很简单,只需要把:if (temp < a[j - increment])这句话修改成:if (temp > a[j - increment])就可以了。

数组排序

事实上,数组的排序不用那么麻烦,上面只是想让大家对一些基本的排序算法有所了解而已。在 java.util.Arrays 类中有一个静态方法 sort,可以用这个类的 sort 方法来对数组进行排序。

示例如下:

  1. public class Test {
  2.    public static void main(String[] args) {
  3.       // 需要排序的数组,目前是按照升序排列的
  4.       int a[] = new int[5];
  5.       a[0] = 3;
  6.       a[1] = 4;
  7.       a[2] = 1;
  8.       a[3] = 5;
  9.       a[4] = 2;

  10.       //数组排序
  11.       java.util.Arrays.sort(a);
  12.       // 检测一下排序的结果
  13.       for (int i2 : a) {
  14.          System.out.println("i=" + i2);
  15.       }
  16.    }
  17. }
复制代码
注意:现在的 sort 方法都是升序的,要想实现降序的,还需要 Comparator 的知识。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

热门推荐

关于我们|小黑屋|手机版|Archiver|南漳热线 ( 鄂ICP备2021000082号-2 || 鄂公网安备 42062402000199号 )

GMT+8, 2024-12-28 02:58

Powered by Discuz! X3.4 Licensed © 2001-2013 Comsenz Inc & Style Design

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