Java排序算法(九):归并排序
来源:互联网 发布:破解软件越来越差 编辑:程序博客网 时间:2024/06/05 11:22
Java排序算法(九):归并排序
归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。
工作原理:
1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4、重复步骤3直到某一指针达到序列尾
5、将另一序列剩下的所有元素直接复制到合并序列尾
代码实现:
- public class MergeSortTest {
- public static void main(String[] args) {
- int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
- print(data);
- mergeSort(data);
- System.out.println("排序后的数组:");
- print(data);
- }
- public static void mergeSort(int[] data) {
- sort(data, 0, data.length - 1);
- }
- public static void sort(int[] data, int left, int right) {
- if (left >= right)
- return;
- // 找出中间索引
- int center = (left + right) / 2;
- // 对左边数组进行递归
- sort(data, left, center);
- // 对右边数组进行递归
- sort(data, center + 1, right);
- // 合并
- merge(data, left, center, right);
- print(data);
- }
- /**
- * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序
- *
- * @param data
- * 数组对象
- * @param left
- * 左数组的第一个元素的索引
- * @param center
- * 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引
- * @param right
- * 右数组最后一个元素的索引
- */
- public static void merge(int[] data, int left, int center, int right) {
- // 临时数组
- int[] tmpArr = new int[data.length];
- // 右数组第一个元素索引
- int mid = center + 1;
- // third 记录临时数组的索引
- int third = left;
- // 缓存左数组第一个元素的索引
- int tmp = left;
- while (left <= center && mid <= right) {
- // 从两个数组中取出最小的放入临时数组
- if (data[left] <= data[mid]) {
- tmpArr[third++] = data[left++];
- } else {
- tmpArr[third++] = data[mid++];
- }
- }
- // 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
- while (mid <= right) {
- tmpArr[third++] = data[mid++];
- }
- while (left <= center) {
- tmpArr[third++] = data[left++];
- }
- // 将临时数组中的内容拷贝回原数组中
- // (原left-right范围的内容被复制回原数组)
- while (tmp <= right) {
- data[tmp] = tmpArr[tmp++];
- }
- }
- public static void print(int[] data) {
- for (int i = 0; i < data.length; i++) {
- System.out.print(data[i] + "\t");
- }
- System.out.println();
- }
- }
public class MergeSortTest {public static void main(String[] args) {int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };print(data);mergeSort(data);System.out.println("排序后的数组:");print(data);}public static void mergeSort(int[] data) {sort(data, 0, data.length - 1);}public static void sort(int[] data, int left, int right) {if (left >= right)return;// 找出中间索引int center = (left + right) / 2;// 对左边数组进行递归sort(data, left, center);// 对右边数组进行递归sort(data, center + 1, right);// 合并merge(data, left, center, right);print(data);}/** * 将两个数组进行归并,归并前面2个数组已有序,归并后依然有序 * * @param data * 数组对象 * @param left * 左数组的第一个元素的索引 * @param center * 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 * @param right * 右数组最后一个元素的索引 */public static void merge(int[] data, int left, int center, int right) {// 临时数组int[] tmpArr = new int[data.length];// 右数组第一个元素索引int mid = center + 1;// third 记录临时数组的索引int third = left;// 缓存左数组第一个元素的索引int tmp = left;while (left <= center && mid <= right) {// 从两个数组中取出最小的放入临时数组if (data[left] <= data[mid]) {tmpArr[third++] = data[left++];} else {tmpArr[third++] = data[mid++];}}// 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)while (mid <= right) {tmpArr[third++] = data[mid++];}while (left <= center) {tmpArr[third++] = data[left++];}// 将临时数组中的内容拷贝回原数组中// (原left-right范围的内容被复制回原数组)while (tmp <= right) {data[tmp] = tmpArr[tmp++];}}public static void print(int[] data) {for (int i = 0; i < data.length; i++) {System.out.print(data[i] + "\t");}System.out.println();}}
运行结果:
- 5 3 6 2 1 9 4 8 7
- 3 5 6 2 1 9 4 8 7
- 3 5 6 2 1 9 4 8 7
- 3 5 6 1 2 9 4 8 7
- 1 2 3 5 6 9 4 8 7
- 1 2 3 5 6 4 9 8 7
- 1 2 3 5 6 4 9 7 8
- 1 2 3 5 6 4 7 8 9
- 1 2 3 4 5 6 7 8 9
- 排序后的数组:
- 1 2 3 4 5 6 7 8 9
536219487356219487356219487356129487123569487123564987123564978123564789123456789排序后的数组:123456789
0 0
- Java排序算法(九):归并排序
- Java排序算法(九):归并排序
- Java排序算法(九):归并排序
- Java排序算法(九):归并排序
- 老生常谈 排序算法(JAVA)-- 归并排序
- 排序算法---归并排序 (java)
- Java排序算法(八):归并排序
- 排序算法--归并排序(JAVA)
- Java排序算法--归并排序(MergeSort)
- Java排序算法 归并排序
- java排序算法---归并排序
- Java排序算法:归并排序
- JAVA排序算法---归并排序
- Java排序算法--归并排序
- Java 排序算法-归并排序
- java归并排序算法
- JAVA归并排序算法
- Java算法 归并排序
- C,指向函数的指针,混乱
- Android中使用HTTP服务
- 学习利用JNI实现Java调C的DLL
- Android使用GSP和百度SDK定位
- 机器学习之各种算法(2)
- Java排序算法(九):归并排序
- android framework audiofocus机制
- Let's talk about VMX, which is Intel VT-x's design.
- 更新整理本人所有博文中提供的代码与工具(C++,2014.09)
- Ubuntu14.04 安装问题汇总
- 赫夫曼编码(优先队列实现)
- 更新整理本人所有博文中提供的代码与工具(Java,2014.09)
- PyCUDA
- 单例模式初探