我尝试使用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]);
}
答案 0 :(得分:0)
你写这个的方法就是总是在数组的末尾“插入”新项目,然后尝试对它进行冒泡排序,但是,你的冒泡排序只能进行一次通过,而且最好是从最后一个位置开始的新项目将进入倒数第二个位置。
如果你真的想将新元素添加到最后一个位置,那么你应该改变for循环,使它从最后一个元素开始,然后向后移动到第一个元素。这将导致它继续冒泡新元素,直到它到达正确的位置。
然而,更有效的方法是首先找到新元素的正确位置,然后将其插入那里。
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++;
}