【从头开始学算法】归并排序
2015-09-27 12:15
344 查看
需求:将数组中元素排序
思路:将数组拆分成若干一个元素的小数组,数组两两合并,
与之前的排序方法不同在于,归并排序,需要额外的空间,用来临时存放合并后的小数组
这个其实不难理解,就是顺着一支向下拆,拆到最下边向上合并,合并完这一支的元素,继续拆下一支(计算机做的顺序)
过程如图,以数组下标0-7为例,黑色为拆分过程,黄色为合并过程,框中数字为矩阵下标,线上数字为处理顺序
时间复杂度:O(nlogn)
空间复杂度:O(n)
思路:将数组拆分成若干一个元素的小数组,数组两两合并,
与之前的排序方法不同在于,归并排序,需要额外的空间,用来临时存放合并后的小数组
public static void MergeSort(int[] arr, int first, int last) { System.out.println("MergeSort"+first+last); int mid = 0; if (last - first > 1) { mid = (last + first) / 2; MergeSort(arr, first, mid);//排序中认为最右端不可达,所以,mid不能+1; MergeSort(arr, mid , last); Merge(arr, first, mid, last); } } private static void Merge(int[] arr, int first, int mid, int last) { System.out.println("Merge"+first+mid+last); int[] arr1 = new int[last - first + 1]; int i = first; int j = mid; int n = 0; while (i < mid && j < last) { if (arr[i] <= arr[j]) { arr1 = arr[i]; i++; n++; } else { arr1 = arr[j]; j++; n++; } } while (i < mid) { arr1 = arr[i]; i++; n++; } while (j < last) { arr1 = arr[j]; j++; n++; } int a = 0; for (int x = first; x <last; x++) { arr[x] = arr1[a++]; } arr1 = null; }
这个其实不难理解,就是顺着一支向下拆,拆到最下边向上合并,合并完这一支的元素,继续拆下一支(计算机做的顺序)
过程如图,以数组下标0-7为例,黑色为拆分过程,黄色为合并过程,框中数字为矩阵下标,线上数字为处理顺序
时间复杂度:O(nlogn)
空间复杂度:O(n)
相关文章推荐
- 初探socket(2)
- 删除有关联表时(drop table)中cascade的含义及用法
- 编程思想之正则表达式
- 【UIKit-110-1】#import <UIKit/UITableView.h> 基础创建
- BZOJ 1006: [HNOI2008]神奇的国度( MCS )
- ORACLE 中ROWNUM用法总结
- C# 子窗口修改主窗口的控件
- android环境搭建NDk和cdt
- javascript中的数据类型---数字
- PHP之——进制转换系统函数
- 零子数组
- python : import sqlite3 测试代码
- java得到clientIP地址和MAC住址
- 第三周vim入门学习2
- LinearHorizontalRecyclerView
- Building real time app with Socket.io and Node.js
- java int和integer的区别
- 联合体(union)
- iOS 判断iphone ipad 系统版本
- Java Web开发之MD5加密用法分析