将数组从最小到最大排序

时间:2017-02-19 00:37:48

标签: java arrays generics

我尝试使用compareTo()将数组从最大到最小排序,结果不是很正确。

public void insert(C data){ 
    arr[currentSize++] = data; // <-- currentSize is initialized to 0 before this
    C temp;
    for(int i = 0; i < currentSize-1; i++) {
        if(arr[i].compareTo(arr[i+1]) < 0) {
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
        }
    }       

}

一个例子是输入:

[0.32371583205781573,0.8906211866288234,0.5288455608245172,0.9170569745456318,0.5103102992069214]

输出为:

[0.9170569745456318,0.5288455608245172,0.5103102992069214,0.32371583205781573,0.8906211866288234]

我尝试在下面向后跑,但结果仍然不正确:

    public void insert(C data){ 
    arr[currentSize++] = data;
    C temp;
    for(int i = currentSize-1; i > 0; i--) {
        if(arr[i].compareTo(arr[i-1]) < 0) {
            temp = arr[i];
            arr[i] = arr[i-1];
            arr[i-1] = temp;
        }
    }       

}

使用以下代码测试代码:

int n = 5;
        PQ<Double> pq1 = new PQasSortedArray<Double>(n);
        double[] arr1 = new double[n];

    for(int i = 0; i < n; i++){
        Random num = new Random();
        arr1[i] = num.nextDouble();
    }

    for (int i=0; i < arr1.length; i++){
        pq1.insert(arr1[i]);
    }

1 个答案:

答案 0 :(得分:0)

你写这个的方法就是总是在数组的末尾“插入”新项目,然后尝试对它进行冒泡排序,但是,你的冒泡排序只能进行一次通过,而且最好是从最后一个位置开始的新项目将进入倒数第二个位置。

如果你真的想将新元素添加到最后一个位置,那么你应该改变for循环,使它从最后一个元素开始,然后向后移动到第一个元素。这将导致它继续冒泡新元素,直到它到达正确的位置。

然而,更有效的方法是首先找到新元素的正确位置,然后将其插入那里。

  • 简单方法:只需循环遍历从索引0开始的现有元素,直到找到一个小于新值的元素(记住我们排序最大到最小),然后在该元素之前插入新元素。
  • 更快的方法:从中间开始实现二分查找。如果中间的元素大于新元素,那么您知道新元素应该在数组的后半部分,否则它在上半部分。然后转到选定的一半的中间并再次执行相同的过程,直到找到正确的位置。

Java具有执行二进制搜索的功能:Arrays.binarySearch。但是,您必须为其提供一个自定义比较器,以反转C的正常比较逻辑。

更新:这种效率较低的第一种策略的实施起作用。我在Comparable方面实现,因为我们并不关心C是什么,只是它是可比较的。

public void insert(Comparable data){
    arr[currentSize] = data; // <-- currentSize is initialized to 0 before this
    for(int i = currentSize; i > 0; i--) {
        if(arr[i].compareTo(arr[i-1]) > 0) {
            Comparable temp = arr[i];
            arr[i] = arr[i-1];
            arr[i-1] = temp;
        }
    }
    currentSize++;
}

实施速度快得多:

public void insert(Comparable data) {
    int position = Arrays.binarySearch(arr, 0, currentSize, data, (left, right) -> right.compareTo(left));
    if (position < 0)
        position = -position - 1;
    System.arraycopy(arr, position, arr, position + 1, currentSize - position);
    arr[position] = data;
    currentSize++;
}