我学会了如何使用比较器,但我对比较器有困难.我的代码中有错误:
Exception in thread "main" java.lang.ClassCastException: New.People cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at New.TestPeople.main(TestPeople.java:18)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import java.util.Comparator;
public class People implements Comparator {
private int id;
private String info;
private double price;
public People(int newid, String newinfo, double newprice) {
setid(newid);
setinfo(newinfo);
setprice(newprice);
}
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
public String getinfo() {
return info;
}
public void setinfo(String info) …
Run Code Online (Sandbox Code Playgroud) 我们知道快速排序是最快的排序算法.
collections.sort使用合并排序算法而不是快速排序.但是Arrays.sort使用快速排序.
Collections.sort使用合并排序而不是快速排序的原因是什么?
我找不到Java 7的文档,我只能找到关于Java 6的文档,它仍然可以快速或合并.有谁知道如何Arrays.sort
在Java 7中找到该方法的文档?
Arrays.java
如果数组长度小于某个阈值,Java 6的mergesort实现将使用insert -sort.此值被硬编码为7.由于算法是递归的,因此对于大型数组,这最终会发生多次.规范的合并排序算法不会这样做,只是使用merge-sort一直向下,直到列表中只有1个元素.
这是优化吗?如果是这样,它应该如何帮助?为什么7
?插入排序(甚至是<=7
事物)会大大增加对大型数组进行排序所需的比较次数 - 因此会增加compareTo()
调用速度慢的排序成本.
(x轴是size of array
,y轴是# of comparisons
,对于不同的值INSERTIONSORT_THRESHOLD
)
为什么?它更快还是更有效?
对于具有一个核心的系统,我们可以使用quicksort.我们应该在具有两个内核,四个内核或八个内核的系统上使用什么?
我无法理解Collections.sort方法的方法实现和逻辑.这是我发现的方法实现,
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator<T> i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set((T)a[j]);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,此方法返回类型为void.什么是<T extends Comparable<? super T>>
方法签名呢?
在这里使用Array.sort的目的是什么?
一旦我们实现了可比较或比较器,我们编写的compare或compareTo方法逻辑会考虑哪些?
我已经尝试过基准测试,出于某种原因,当在 1M 元素的数组上尝试它们时,它们在0.3 秒内Mergesort
排序并Quicksort
花费了 1.3 秒。
我听说快速排序通常更快,因为它的内存管理,但如何解释这些结果?
如果这有什么不同,我正在运行 MacBook Pro。输入是一组从 0 到 127 的随机生成的整数。
代码在Java中:
归并排序:
static void mergesort(int arr[]) {
int n = arr.length;
if (n < 2)
return;
int mid = n / 2;
int left[] = new int[mid];
int right[] = new int[n - mid];
for (int i = 0; i < mid; i++)
left[i] = arr[i];
for (int i = mid; i < n; i++)
right[i - mid] = arr[i];
mergesort(left);
mergesort(right); …
Run Code Online (Sandbox Code Playgroud) 在collections类中有一个方法sort()用于排序集合元素,但我有一个疑问,内部使用哪种排序算法对元素进行排序.我用Google搜索但没有得到正确答案.请帮帮我 .
java ×8
sorting ×4
collections ×3
algorithm ×2
mergesort ×2
arrays ×1
benchmarking ×1
comparator ×1
quicksort ×1
timsort ×1