Java MergeSort中的泛型数组初始化

Java MergeSort中的泛型数组初始化,java,generics,mergesort,Java,Generics,Mergesort,这是我的代码,用来实现一个通用的合并排序 导入java.util.array; 公共类合并排序{ 公共静态void main(字符串[]args){ 整数[]int_arr={10,20,35,40,13,42}; MergeSort IntegerSort=新的MergeSort(); IntegerSort.Merge_Sort(int_arr,0,int_arr.length-1); System.out.println(Arrays.toString(int_arr)); } 私有无效合

这是我的代码,用来实现一个通用的合并排序

导入java.util.array;
公共类合并排序{
公共静态void main(字符串[]args){
整数[]int_arr={10,20,35,40,13,42};
MergeSort IntegerSort=新的MergeSort();
IntegerSort.Merge_Sort(int_arr,0,int_arr.length-1);
System.out.println(Arrays.toString(int_arr));
}
私有无效合并_排序(T[]A,int低,int高){
如果(低<高){
int mid=(低+高)/2;
合并排序(A、低、中);
合并排序(A、中+1、高);
合并(A、低、中、高);
}
}
私有无效合并(T[]A,整数低,整数中,整数高){
int n1=中低+1;
int n2=高-中;
T[]Left_sub=(T[])新对象[n1];
T[]Right_sub=(T[])新对象[n2];
对于(int i=0;i
我遇到了这个运行时错误

Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Comparable; ([Ljava.lang.Object; and [Ljava.lang.Comparable; are in module java.base of loader 'bootstrap')
我在这方面错了

T[] Left_sub = (T[]) new Object[n1];
T[] Right_sub = (T[]) new Object[n2];
我尝试了其他方法,比如
Arrays.copyofrange()
ArrayList
是否有其他方法初始化泛型数组。
请在
Merge()
函数中建议执行合并过程的方法

要复制数组的范围,应使用
数组。copyRangeOf

    T[] Left_sub = Arrays.copyOfRange(A, low, mid + 1);
    T[] Right_sub = Arrays.copyOfRange(A, mid, high + 1);
请注意以下几点:

  • 使用切片最后一个元素的索引作为
    high
    参数很容易出错,您应该使用下一个元素的索引,这样切片的长度就是
    high-low
  • 您可以简化
    merge
    方法,只复制切片的左部分,因为右部分的元素在复制之前不会被覆盖
  • 您应该修改循环以避免从子阵列读取不存在的元素
以下是修改后的版本:

导入java.util.array;
公共类合并排序{
公共静态void main(字符串[]args){
整数[]int_arr={10,20,35,40,13,42};
MergeSort IntegerSort=新的MergeSort();
IntegerSort.Merge\u Sort(整数数组,0,整数数组长度);
System.out.println(Arrays.toString(int_arr));
}
私有无效合并_排序(T[]A,int低,int高){
如果(高-低>=2){
int mid=low+(高-低)/2;//避免过多或过大的值
合并排序(A、低、中);
合并排序(A、中、高);
合并(A、低、中、高);
}
}
私有无效合并(T[]A,整数低,整数中,整数高){
T[]Left_sub=Arrays.copyOfRange(A、low、mid);
int i=0,j=mid,n1=mid-low;
对于(int k=低;k<高;k++){

如果(ihigh | | | Left| u sub[i].compareTo(A[j])要复制数组的范围,则应使用
数组。copyRangeOf

    T[] Left_sub = Arrays.copyOfRange(A, low, mid + 1);
    T[] Right_sub = Arrays.copyOfRange(A, mid, high + 1);
请注意以下几点:

  • 使用切片最后一个元素的索引作为
    high
    参数很容易出错,您应该使用下一个元素的索引,这样切片的长度就是
    high-low
  • 您可以简化
    merge
    方法,只复制切片的左部分,因为右部分的元素在复制之前不会被覆盖
  • 您应该修改循环以避免从子阵列读取不存在的元素
以下是修改后的版本:

导入java.util.array;
公共类合并排序{
公共静态void main(字符串[]args){
整数[]int_arr={10,20,35,40,13,42};
MergeSort IntegerSort=新的MergeSort();
IntegerSort.Merge\u Sort(整数数组,0,整数数组长度);
System.out.println(Arrays.toString(int_arr));
}
私有无效合并_排序(T[]A,int低,int高){
如果(高-低>=2){
int mid=low+(高-低)/2;//避免过多或过大的值
合并排序(A、低、中);
合并排序(A、中、高);
合并(A、低、中、高);
}
}
私有无效合并(T[]A,整数低,整数中,整数高){
T[]Left_sub=Arrays.copyOfRange(A、low、mid);
int i=0,j=mid,n1=mid-low;
对于(int k=低;k<高;k++){
如果(ihigh | | | Left | u sub[i]),比较(A[j])