使用ArrayList优化合并排序

时间:2018-04-25 15:40:06

标签: java algorithm sorting merge

我写了这个版本的Merge Sort(这是我合并部分的部分),但它有一个问题。我想将它与泛型一起使用,所以我在这个过程中创建了一个Object数组来帮助我。当我编译时,它会发出一个警告,我用代码顶部的那一行压缩了它。有没有办法避免使用Object数组? (方法比较来自另一个类,但它与compareTo的工作方式相同):

@SuppressWarnings("unchecked")
  public static <T> void merge(ArrayList<T> array, Comparator<T> c, int p, int mid, int q) {
    Object[] tmp = new Object[q-p+1]; 
    int i = p;
    int j = mid+1;
    int k = 0;
    while (i <= mid && j <= q) {
        if (c.compare(array.get(i), array.get(j))<0)
          tmp[k] = array.get(i++);
        else
          tmp[k] = array.get(j++);
        k++;
    }
    if (i <= mid && j > q) {
        while (i <= mid) 
          tmp[k++] = array.get(i++);
    } else {
        while (j <= q)
          tmp[k++] = array.get(j++);
    }
    for (k = 0; k < tmp.length; k++)
      array.set(k+p, (T)tmp[k]);
  }

2 个答案:

答案 0 :(得分:0)

public static <T> void merge(ArrayList<T> array, Comparator<T> c, int p, int mid, int q) {
        ArrayList<T> tmp = new ArrayList<T>(q-p+1); 
        int i = p;
        int j = mid+1;
        int k = 0;
        while (i <= mid && j <= q) {
            if (c.compare(array.get(i), array.get(j))<0)

                tmp.add(array.get(i++));
            else
                tmp.add(array.get(j++));
            k++;
        }
        if (i <= mid && j > q) {
            while (i <= mid) 
                tmp.add(array.get(i++));
        } else {
            while (j <= q)
                tmp.add(array.get(j++));
        }
        for (k = 0; k < tmp.size(); k++)
          array.set(k, tmp.get(k));

        System.out.println(array);
      }

您可以通过这种方式跳过对象数组。希望它有所帮助:)

答案 1 :(得分:0)

你的代码很好。 您也可以使用:

T[] tmp = (T[]) new Object[q - p + 1];

具有相同的抑制注释,并跳过(T)tmp [k]的转换。