您的位置:首页 > 编程语言 > Java开发

java 实现二分归并排序

2016-04-10 17:23 513 查看
首先 解释一下什么是归并排序的精髓就是把一个乱序数组划分成小的数组来排序,然后再把小的数组合并成大的小组,下面的这张图能够明确说明什么是归并排序



虽然看图感觉二路归并排序很简单,但是实际操作起来还是有一点麻烦的

这是主函数

public static void main(String[] args) {
int[] array = new int[] { 10, 9, 5, 11, 45, 23, 2, 13 };
splitArray(array, 0, array.length - 1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}

}


private static void sort(int[] array, int left, int mid, int right) {
int[] leftArray = new int[mid-left];//第一个数组的长度
int[] rightArray = new int[right - mid + 1];//第二个数组的长度
int i = 0, j = 0, k = 0;
for (i = left; i < mid; i++)//将最传进来大的数组分成两个小的数组,分别为LeftArray与RightArray
leftArray[i - left] = array[i];
for (i = mid; i <= right; i++)
rightArray[i - mid] = array[i];
i = 0;
j = 0;
k = left;
while (i < mid - left && j < right - mid + 1) {//任意一个不满足条件即可退出
/*
* 这里就是把两个数组有序的合在一起的精髓,将第一个数组的第一个元素与第二个数组的第一个元素相比较,如果第一个数组的元素是小的就讲这个值复制给最大的数组的第一位
* 然后最大数组与复制给最大数组的数组下标都自加
*/
if (leftArray[i] < rightArray[j]) {
array[k++] = leftArray[i++];

} else {
array[k++] = rightArray[j++];

}

}
/*
* 上面的while循环跳出 检查将后面的没有排完的值全部加给最大的数组
*/
while (i < mid - left) {
array[k++] = leftArray[i++];
}
while (j < right - mid + 1) {
array[k++] = rightArray[j++];
}

}


这里就是合并了,把两个数组合并为一个数组

然后我们看最为核心的东西

private static void splitArray(int[] array, int left, int right) {

if (left == right) {
return;
} else {
int mid = (right + left) >> 1;//得到中间值
splitArray(array, left, mid);//处理左边的数组
splitArray(array, mid+1, right);//处理右边的数组
sort(array, left, mid+1 , right);//归并

}
}


在这里将传递进来的左边与右边分别是最大数组的最大下标与最小下标,将他们除2 我们就可以得到他的中间值,然后递归第一个递归是处理左边的数组将左边的数组分割,第二个递归是处理右边的递归,第三个递归就是调用第二个sort函数将他们排序并且组合在一起

也许在三个递归你会感觉到理解有点困难,我们来debug 调试一下你就会发现他的规律了





End!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: