归并算法
来源:互联网 发布:淘宝店现在生意怎么样 编辑:程序博客网 时间:2024/04/29 11:53
MergeSort归并排序就是将一组数分割成两个子数组,再对子数组进行排序,然后再归并起来。
在这个过程中,通过递归的方式对子数组进行归并排序。
过程(Wikipedia):
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
代码实现(java):
- import java.util.Arrays;
- public class MergeSort {
- public static void mergeSort(int [] array){
- int middle=array.length/2;//中间标
- if(array.length>1){
- int[]left=Arrays.copyOfRange(array,0,middle);//拷贝数组array的左半部分
- int[]right=Arrays.copyOfRange(array,middle,array.length);//拷贝数组array的右半部分
- mergeSort(left);//对左边数组递归
- mergeSort(right);//对右边数组递归
- merge(array,left,right);//数组左、右合并到Array
- for (int j = 0; j < array.length; j++) {
- System.out.print(array[j]);
- System.out.print(",");
- }
- System.out.println();
- }
- }
- //合并数组,升序
- private static void merge(int[]result,int[]left,int[]right){
- int i=0,l=0,r=0;
- while(l<left.length&&r<right.length){
- if(left[l]<right[r]){
- result[i]=left[l];
- i++;
- l++;
- }else{
- result[i]=right[r];
- i++;
- r++;
- }
- }
- //如果右边剩下合并右边的
- while(r<right.length){
- result[i]=right[r];
- r++;
- i++;
- }
- //如果左边剩下合并左边的
- while(l<left.length){
- result[i]=left[l];
- l++;
- i++;
- }
- }
- public static void main(String[] args) {
- int[] arr = { 55, 56, 23, 90, 47, 9, 40, 82, 76, 33 };
- for (int i = 0; i < arr.length; i++) {
- System.out.print(arr[i]);
- System.out.print(",");
- }
- System.out.println();
- mergeSort(arr);
- }
- }
55,56,23,90,47,9,40,82,76,33,
55,56,
47,90,
23,47,90,
23,47,55,56,90,
9,40,
33,76,
33,76,82,
9,33,40,76,82,
9,23,33,40,47,55,56,76,82,90,
0 0
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- 归并算法
- IOCP相关梳理
- Leetcode 169 - Majority Element(Moore投票算法)
- android Android性能优化之如何避免Overdraw
- c++ 之菱形继承
- WCF之客户端
- 归并算法
- 3.为Android构建变种版本
- redis基本结构(3)------列表(list)
- 【年总】2016的一些事
- VTK Example代码编译运行
- matlab绘制海洋图
- Python爬虫爬取糗事百科热文
- java 基本数据类型
- 1.Spring框架入门