Java:ArrayList的合并排序不起作用
它可以正确地比较对象,但使用重复的对象会使列表的大小加倍Java:ArrayList的合并排序不起作用,java,sorting,mergesort,Java,Sorting,Mergesort,它可以正确地比较对象,但使用重复的对象会使列表的大小加倍 public static void mergeSort(List<Person> list) { List<Person> helper = new ArrayList<Person>(list.size()); mergeSort(list, helper, 0, list.size()); } private static void mergeSo
public static void mergeSort(List<Person> list) {
List<Person> helper = new ArrayList<Person>(list.size());
mergeSort(list, helper, 0, list.size());
}
private static void mergeSort(List<Person> list, List<Person> helper, int low, int high) {
if(low < high) {
int middle = (low+high)/2;
mergeSort(list, helper, low, middle); //sort left half
mergeSort(list, helper, middle+1, high); //sort right half
merge(list, helper, low, middle, high); // merge
}
}
private static void merge(List<Person> list, List<Person> helper, int low, int middle, int high) {
for(int i=low; i<= high; i++) {
helper.add(i, list.get(i));
}
int helperLeft = low;
int helperRight = middle + 1;
int current = low;
/**
* Iterate through helper array, copying back smaller element in the original list
*/
while(helperLeft <= middle && helperRight <= high) {
if(helper.get(helperLeft).isLessThan( helper.get(helperRight))) {
list.add(current, helper.get(helperLeft));
helperLeft++;
} else {
list.add(current, helper.get(helperRight));
helperRight++;
}
current++;
}
//Copy remaining elements
int remaining = middle - helperLeft;
for(int j=0; j <= remaining; j++) {
list.add(current+j, helper.get(helperLeft+j));
}
}
公共静态无效合并排序(列表){
List helper=newarraylist(List.size());
mergeSort(list,helper,0,list.size());
}
私有静态void合并排序(列表列表、列表帮助器、整型低、整型高){
如果(低<高){
int-middle=(低+高)/2;
mergeSort(list,helper,low,middle);//对左半部分进行排序
mergeSort(list,helper,middle+1,high);//对右半部分进行排序
合并(列表、辅助对象、低、中、高);//合并
}
}
私有静态无效合并(列表列表、列表帮助器、低整型、中整型、高整型){
对于(inti=low;i有几个问题
不要使用列表#添加
,使用列表#设置
而不是
while(helperLeft <= middle && helperRight <= high) {
if(helper.get(helperLeft).isLessThan( helper.get(helperRight))) {
list.add(current, helper.get(helperLeft));
helperLeft++;
} else {
list.add(current, helper.get(helperRight));
helperRight++;
}
current++;
}
//Copy remaining elements
int remaining = middle - helperLeft;
for(int j=0; j <= remaining; j++) {
list.add(current+j, helper.get(helperLeft+j));
}
for (int i = low; i <= high; i++) {
helper.add(i, list.get(i));
}
while (helperLeft <= middle && helperRight <= high) {
你应该使用
for (int i = low; i < high; i++) {
helper.add(i, list.get(i));
}
当不使用<代码>列表时,添加< <代码> >尝试使用<代码>列表。设置< <代码>,在新的一个有趣的部分不使用<代码> >代码> > < <代码> >之前,应该考虑给予反馈,我认为<代码>添加< /代码>是正确的。离子
用于我。用于(int i=低;i
for (int i = low; i <= high; i++) {
helper.add(i, list.get(i));
}
for (int i = low; i < high; i++) {
helper.add(i, list.get(i));
}
while (helperLeft <= middle && helperRight <= high) {
while (helperLeft < middle && helperRight < high) {
----Unsorted
1L; 10/01/1960
1L; 04/05/1978
1L; 09/17/1986
1L; 02/15/1971
1L; 07/01/1971
----Sorted
1L; 10/01/1960
1L; 02/15/1971
1L; 07/01/1971
1L; 04/05/1978
1L; 09/17/1986
private static void mergeSort(List<Person> list, List<Person> helper, int low, int high) {
if(high - low<2) {
sortTheSmallList(list,low,high);
}else{
int middle = (low+high)/2;
mergeSort(list, helper , low, middle); //sort left half
mergeSort(list, helper, middle+1, high); //sort right half
merge(list, helper, low, middle, high);
}
}