class DArray{
public void mergeSort(int[] arr,int left,int right){
if(left<right){
int center = (left+right)/2;
mergeSort(arr,left,center);
mergeSort(arr,center+1,right);
merge(arr,left,center+1,right);
}
}
public void merge(int[] arr,int left,int center,int right){
int[] a = new int[right-left];
int lef = left;
int cen = center;
int k = 0;
while(lef<center && cen<right){
if(arr[lef]<=arr[cen]){
a[k++] = arr[lef++];
}else{
a[k++] = arr[cen++];
}
}
while(lef<center){
a[k++] = arr[lef++];
}
while(cen<right){
a[k++] = arr[cen++];
}
for(int i=0;i<a.length;i++){
arr[i] = a[i];
}
}
}
public class MergeSortApp{
public static void main (String[] args) {
int[] arr = {22,66,11,44,88,33,34};
DArray d = new DArray();
d.mergeSort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print (arr[i]+" ");
}
System.out.println ();
}
}找不到哪个地方有问题``麻烦指点下,
希望,高手能给个好点的归并排序算法,(最好带注释)
这是我博客里的一篇 以前写的.希望对你有帮助.
merge(arr,left,center+1,right); 调用地方错了
int a[] = { 21, 34, 56, 43, 99, 37, 78, 10 };// 这里对8个元素进行排序
int low = 0, high = 7;// 初始化low和high的值
// 辅助数组b
int b[] = new int[a.length]; System.out.print("排序前:");
for (int i = 0; i <= high; i++) {
System.out.print(a[i] + " ");
}
// 归并排序
mergerSort(a, low, high, b); System.out.print("排序后:");
for (int i = 0; i <= high; i++) {
System.out.print(a[i] + " ");
}
} /**
* 分治和归并
*
* @param a
* @param low
* @param high
* @param b
*/
public static void mergerSort(int a[], int low, int high, int b[]) {
int mid = 0;
if (low < high) {
mid = (high + low) / 2;// 分治位置
mergerSort(a, low, mid, b);
mergerSort(a, mid + 1, high, b);
merger(a, low, mid, high, b);// 归并
} } /**
* 合并两个有序子序列
*
* @param a
* @param low
* @param mid
* @param high
* @param b
* 辅助数组
*/
public static void merger(int[] a, int low, int mid, int high, int b[]) { int i = low;
int j = mid + 1;
int p = 0;
// 合并两个有序数组 子序列1 a[low..mid] 子序列2 a[mid+1..high]
while (i <= mid && j <= high) {
b[p++] = (a[i] <= a[j]) ? a[i++] : a[j++];
}
// 如果子序列1没有合并完则直接复制到复制数组中去
while (i <= mid) {
b[p++] = a[i++];
}
// 如果子序列2没有合并完则直接复制到复制数组中去
while (j <= high) {
b[p++] = a[j++];
}
// 把辅助数组的元素复制到原来的数组中去
for (p = 0, i = low; i <= high; i++, p++) {
a[i] = b[p];
}
}
}给你一段啊,网上有啊,上面的注解详细你可以看一下
class DArray{
public void mergeSort(int[] arr,int left,int right){
if(left<right){
int center = (left+right)/2;
mergeSort(arr,left,center);
mergeSort(arr,center+1,right);
merge(arr,left,center+1,right);
}
}
//将arr的子数组arr[left,center-1]和arr[center,right]合并
public void merge(int[] arr,int left,int center,int right){
int[] a = new int[right-left+1];//arr的长度应该是right-left+1
int lef = left;
int cen = center;
int k = 0;
while(lef<center && cen<=right){//右侧数组的最后一个元素的下标应该是right
//所有cen应该索引到right
if(arr[lef]<=arr[cen]){
a[k++] = arr[lef++];
}else{
a[k++] = arr[cen++];
}
}
while(lef<center){
a[k++] = arr[lef++];
}
while(cen<=right){//同上
a[k++] = arr[cen++];
}
for(int i=0,j=left;i<a.length;i++,j++){
arr[j] = a[i];//应该是将arr的子数组arr[left,right]进行合并
//所以复制的开始下标应该是left,而不是0.
}
}
}
public class MergeSortApp{
public static void main (String[] args) {
int[] arr = {22,66,11,44,88,33,34};
DArray d = new DArray();
d.mergeSort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print (arr[i]+" ");
}
System.out.println ();
}
}
已经把有问题的地方改过来了,在有问题的地方坐了注释,方便楼主对照。
楼主的问题就是数组下标没有考虑清楚。注意下就可以了