二分归并排序
来源:互联网 发布:java符号 编辑:程序博客网 时间:2024/06/03 07:33
二分归并排序
归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
将两个有序序列,合并成一个新的有序序列,分别取两个有序序列的最小值,将两个最小值比较,取最小
最坏情况下时间复杂度:O(nlogn)
平均情况下时间复杂度:O(nlogn)
java实现
package com.cn;import java.util.Arrays;public class TwoDivisionSort { public static void main(String[] args) { int[] a = {45,36,18,53,72,30,48,93,15,36}; TwoDivisionSort td = new TwoDivisionSort(); td.Sort(a, 0, a.length-1); System.out.println(Arrays.toString(a)); } //二分排序 public void Sort(int[] a,int start,int end){ if(start < end){ int mid = (start + end)/2; //左 Sort(a,start,mid); //右 Sort(a,mid+1,end); //左右归并成一个新的有序序列 Merge(a,start,mid,end); } } //将两个有序序列合并成一个有序序列 public void Merge(int[] a,int start,int mid,int end){ int[] num = new int[end-start+1];//用于存放新排好序的序列 int s1 = start;//第一个序列的起始下标 int s2 = mid + 1;//第二个序列的起始下标 int i = 0;//num[]数组的起始下标 //通过比较将较小元素先放入num数组 while(s1 <= mid && s2 <= end){ if(a[s1] < a[s2]){ num[i] = a[s1]; ++i; ++s1; }else{ num[i] = a[s2]; ++i; ++s2; } } //将第一个序列的剩余元素放入num[] while(s1 <= mid){ num[i] = a[s1]; ++i; ++s1; } //将第二个序列的剩余元素放入num[] while(s2 <= end){ num[i] = a[s2]; ++i; ++s2; } //将num[]中的元素复制到数组a for(int j = 0;j < num.length;j++){ a[j+start] = num[j]; } }}
0 0
- 二分归并排序
- 归并排序(二分) 应用
- 二分归并排序
- 二分归并排序
- 归并排序 二分查找
- 归并、二分插入排序
- java 实现二分归并排序
- JAVA冒泡排序,归并排序,二分查找
- 选择排序,冒泡排序,二分搜索,插入排序,归并排序
- 排序(2)二分排序、快速排序、归并排序
- POJ 2104 归并排序树+二分查找
- 算法学习-归并排序和二分查找
- 同事写的二分归并排序
- C语言二分归并排序的实现
- 二分归并排序之求逆序数
- Python Numpy Tutorial: 二分归并排序
- 递归算法——归并排序,快速排序,二分查找
- #1141 : 二分·归并排序之逆序对(归并排序)
- 疯狂Java学习笔记(49)------------异常处理机制
- 最近打算学习下flash开发,搭建一个flascc的环境,遇到了点问题
- Python计算斐波那契数列
- LogisticRegression
- STL学习记录(八)Sets、Multisets
- 二分归并排序
- thinking in java 11——Arrays相关方法源码
- Google MapReduce读后感
- OpenGL 中常用的 GLUT 函数库
- 文件名或路径太长导致没法移动或复制
- hdu 5046 airport DLX可重复覆盖
- Swing线程实现进度条的更新
- 线程同步和线程通信
- 新书:锋利的SQL(第2版)开始发售及代码下载