java 实现二分归并排序
2016-04-10 17:23
609 查看
首先 解释一下什么是归并排序的精髓就是把一个乱序数组划分成小的数组来排序,然后再把小的数组合并成大的小组,下面的这张图能够明确说明什么是归并排序
虽然看图感觉二路归并排序很简单,但是实际操作起来还是有一点麻烦的
这是主函数
这里就是合并了,把两个数组合并为一个数组
然后我们看最为核心的东西
在这里将传递进来的左边与右边分别是最大数组的最大下标与最小下标,将他们除2 我们就可以得到他的中间值,然后递归第一个递归是处理左边的数组将左边的数组分割,第二个递归是处理右边的递归,第三个递归就是调用第二个sort函数将他们排序并且组合在一起
也许在三个递归你会感觉到理解有点困难,我们来debug 调试一下你就会发现他的规律了
End!!!!
虽然看图感觉二路归并排序很简单,但是实际操作起来还是有一点麻烦的
这是主函数
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!!!!
相关文章推荐
- java中创建对象的方法(转)
- JavaWEB+Ajax实现文件上传
- LeetCode 206 -Reverse Linked List ( JAVA )
- 深入理解java虚拟机--线程安全与优化
- Spring中@Transactional用法深度分析之一
- RxJava 常见误区(一):过度使用 Subject
- JAVA 内部类
- Java中String类的方法及说明
- java封装示例代码
- Java 高并发缓存与Guava Cache
- 20145230java实验报告1
- Java并发编程系列之二十八:CompletionService
- Jdk的安装及配置
- Java中引用类型变量的转换
- HashMap的工作原理
- 20145208 《Java程序设计》第6周学习总结
- struts2继承StrutsTypeConverter实现自定义类型转换器
- JAVA学习总结一(截止4月10日)
- 20145218 《Java程序设计》第六周学习总结
- springmvc接收返回json对象