合并排序算法实现的具体问题
Specific problem with Implementation of a Merge Sort Algorithm
Java
我正在尝试编写一个合并排序算法,以便将自定义对象列表按字母顺序排序,现在我已经查看了我的代码和伪代码几个小时,但还没有弄清楚为什么会这样不工作,
也许一些新鲜的眼睛会有所帮助,
我的代码如下...
/**
* Merge Sort Algorithm
* @param array array to sort
* @param i - point to start sorting at
* @param j - point to end sorting at
*/
public void MergeSort(Movie[] array, int i, int j) {
if(i < j){
int m = (i+j)/2;
MergeSort(array, i, m);
MergeSort(array, m+1, j);
merge(array,m);
}
}
void merge(Movie[] array, int m){
int p = 0;
int q = m+1;
int r = 0;
int j = array.length-1;
Movie[] temp = new Movie[array.length];
while(p <= m && q <= j){
if(array[p].compareTo(array[q]) == 1){
temp[r++] = array[p++];
}else{
temp[r++] = array[q++];
}
}
while (p <= m){
temp[r++] = array[p++];
}
while (q <= j){
temp[r++] = array[q++];
}
System.arraycopy(temp,0,array,0,temp.length);
}
测试"a,b,c,d,e,h,y,z"个案例时,输出如下...
a |
b |
d |
e |
h |
c |
y |
z |
显然这不是按字母顺序排列的,只是想不通为什么
查看您在 中发布的伪代码,我可以告诉您您尚未实现给定的伪代码。
Merge(A[i...j], m)函数有参数m,也就是mid,数组 A and 参数 i 和 j 到定义该数组中合并的界限。在我看来,伪代码既不精确又糟糕。
参数i和j用于初始化p和r。在您当前的实现中,您正在使用 0
初始化两者,这不是伪代码所做的。
您的方法 merge
需要这两个参数 i
和 j
来定义合并的边界。
Java
我正在尝试编写一个合并排序算法,以便将自定义对象列表按字母顺序排序,现在我已经查看了我的代码和伪代码几个小时,但还没有弄清楚为什么会这样不工作,
也许一些新鲜的眼睛会有所帮助,
我的代码如下...
/**
* Merge Sort Algorithm
* @param array array to sort
* @param i - point to start sorting at
* @param j - point to end sorting at
*/
public void MergeSort(Movie[] array, int i, int j) {
if(i < j){
int m = (i+j)/2;
MergeSort(array, i, m);
MergeSort(array, m+1, j);
merge(array,m);
}
}
void merge(Movie[] array, int m){
int p = 0;
int q = m+1;
int r = 0;
int j = array.length-1;
Movie[] temp = new Movie[array.length];
while(p <= m && q <= j){
if(array[p].compareTo(array[q]) == 1){
temp[r++] = array[p++];
}else{
temp[r++] = array[q++];
}
}
while (p <= m){
temp[r++] = array[p++];
}
while (q <= j){
temp[r++] = array[q++];
}
System.arraycopy(temp,0,array,0,temp.length);
}
测试"a,b,c,d,e,h,y,z"个案例时,输出如下...
a |
b |
d |
e |
h |
c |
y |
z |
显然这不是按字母顺序排列的,只是想不通为什么
查看您在
Merge(A[i...j], m)函数有参数m,也就是mid,数组 A and 参数 i 和 j 到定义该数组中合并的界限。在我看来,伪代码既不精确又糟糕。
参数i和j用于初始化p和r。在您当前的实现中,您正在使用 0
初始化两者,这不是伪代码所做的。
您的方法 merge
需要这两个参数 i
和 j
来定义合并的边界。