0、工具类SortHelper

/**
* 排序相关的辅助类
*/
public class SortHelper {

  private SortHelper() {
  }

  /**
   * 生成一个数组长度为n的随机数组,每个元素的范围为[rangeL, rangeR]
   * 
   * @param n
   * @param rangeL
   * @param rangeR
   * @return
   */
  public static Integer[] generateRandomArray(int n, int rangeL, int rangeR) {
    assert rangeL <= rangeR;

    Integer[] arr = new Integer[n];
    for (int i = 0; i < n; i++) {
      arr[i] = new Integer((int) (Math.random() * (rangeR - rangeL + 1) + rangeL));
    }
    return arr;
  }

  /**
   * 1、生成一个数组长度为n的近乎有序数组;
   * 2、swapTimes定义了数组的无序程度:当swapTimes==0时,数组完全有序;swapTimes越大,数组越趋向于无序。
   * 
   * @param n
   * @param swapTimes
   * @return
   */
  public static Integer[] generateNearlyOrderedArray(int n, int swapTimes) {

    // 首先生成一个含有[0……n-1]的完成有序数组,之后随即交换swapTimes对数据。
    Integer[] arr = new Integer[n];
    for (int i = 0; i < n; i++) {
      arr[i] = new Integer(i);
    }

    for (int i = 0; i < swapTimes; i++) {
      int a = (int) (Math.random() * n);
      int b = (int) (Math.random() * n);
      swap(arr, a, b);
    }

    return arr;
  }

  /**
   * 判断一个数组是否有序
   * 
   * @param arr
   * @return
   */
  public static boolean isSorted(Comparable[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
      if (arr[i].compareTo(arr[i + 1]) > 0) {
        return false;
      }
    }
    return true;
  }

  /**
   * 测试sortClassName所对应的排序算法排序arr数组所得到的正确性和算法运行时间(默认不打印排序后数组)
   * 
   * @param sortClassName
   * @param methodName
   * @param arr
   */
  public static void testSort(String sortClassName, String methodName, Comparable[] arr) {
    testSort(sortClassName, methodName, arr, false);
  }

  /**
   * 测试sortClassName所对应的排序算法排序arr数组所得到的正确性和算法运行时间
   * 
   * @param sortClassName
   * @param methodName
   * @param arr
   * @param print
   *          是否打印排序后的数组
   */
  public static void testSort(String sortClassName, String methodName, Comparable[] arr,
      boolean print) {
    // 通过Java的反射机制,通过排序的类名,运行排序函数
    try {
      // 通过sortClassName获得排序函数的Class对象
      Class sortClass = Class.forName(sortClassName);
      // 通过排序函数的Class对象获得排序方法
      Method sortMethod = sortClass.getMethod(methodName, new Class[] {
        Integer[].class });
      // 排序参数只有一个,是可比较数组arr
      Object[] params = new Object[] {
        arr };

      long startTime = System.currentTimeMillis();
      // 调用排序函数
      Integer[] result = (Integer[]) sortMethod.invoke(null, params);
      long endTime = System.currentTimeMillis();

      assert isSorted(arr);
      if (print) {
        SortHelper.printArr("排序后数组:", result);
      }
      System.out.println(sortClass.getSimpleName() + "->" + methodName + "用时: "
          + (endTime - startTime) + "ms");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 打印数组中的每个元素
   * 
   * @param title
   * @param arr
   */
  public static void printArr(String title, Integer[] arr) {
    System.out.println(title);
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + (i == arr.length - 1 ? "" : ","));
    }
    System.out.println();
  }

  /**
   * 交换数组中两个位置的值,第j个位置的数和第i个位置的数进行交换位置
   * 
   * @param arr
   *          要交换的数组
   * @param i
   *          要交换的位置
   * @param j
   *          待交转的位置
   */
  public static void swap(Integer[] arr, int i, int j) {
    Integer temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
  }
}

 

转载于:https://my.oschina.net/u/3550572/blog/978918

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值