Java 将数组从最小到最大排序

Java 将数组从最小到最大排序,java,arrays,generics,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]) &

我试图使用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;
        }
    }       

}
publicsvoid插入(C数据){
arr[currentSize++]=data;//0;i--){
if(arr[i].比较(arr[i-1])<0{
温度=arr[i];
arr[i]=arr[i-1];
arr[i-1]=温度;
}
}       
}
代码通过以下方式进行测试:

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]);
    }
int n=5;
PQ pq1=新的PQ组合阵列(n);
double[]arr1=新的双精度[n];
对于(int i=0;i
编写此命令的方法是始终在数组末尾“插入”新项,然后尝试对其进行冒泡排序,但是,冒泡排序只进行一次,最多从最后一个位置开始的新项将移动到倒数第二个位置

如果确实要将新元素添加到最后一个位置,则应更改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(可比数据){
arr[currentSize]=data;//0;i--){
if(arr[i].比较(arr[i-1])>0{
可比温度=arr[i];
arr[i]=arr[i-1];
arr[i-1]=温度;
}
}
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++;
}
public void insert(可比数据){
int position=Arrays.binarySearch(arr,0,currentSize,data,(左,右)->right.compareTo(左));
如果(位置<0)
位置=-位置-1;
系统阵列副本(arr,位置,arr,位置+1,当前大小-位置);
arr[位置]=数据;
currentSize++;
}

如果要将元素添加到数组的末尾,是否应该向后遍历该数组?反转所有内容并向后遍历数组仍然不能得到正确的结果。我将把它添加到OP中。我添加了一个工作实现,如果您的实现是这样的,请告诉我。使用该代码,结果保持不变。我不确定我的错误是否存在于代码的其他地方。您发布的更新代码与我的不同。我大于0,而你小于0。换句话说,当新元素较大时,我交换元素(将较大的元素移到前面),而当新元素较小时,你交换元素。
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++;
}