Java 将数组从最小到最大排序
我试图使用compareTo()将数组从最大到最小排序,结果并不完全正确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]) &
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开始遍历现有元素,直到找到一个小于新值的元素(请记住,我们是从最大到最小排序),然后在该元素之前插入新元素
- 更快的方式:从中间开始执行二进制搜索。如果中间的元素大于新元素,那么你知道新元素应该在数组的后半部分,否则它在上半部。然后转到所选一半的中间,再次进行相同的过程,直到找到正确的位置
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++;
}