归并排序
来源:互联网 发布:数据库关系范式分解 编辑:程序博客网 时间:2024/06/15 15:12
这里讲的是归并排序的递归算法,非递归算法将在后续补充
归并我们采用分治的思想,
1.首先给出一个数组,我们可以将其一分为二;
2.对于两个子数组的我们也要对其进行排序然后将两个有序的数组合并;
3.将两个有序的数组合并在一起,时间复杂度为O(n);
4.对与两个子数组的处理我们可以回归到第一步,故可以采用递归的方式
不多说先上代码 :
<span style="font-family:KaiTi_GB2312;font-size:18px;">package sort;import sortbasic.SortBase;public class MergeSort extends SortBase {static Comparable[] aux;public static void sort(Comparable[] a,int begin,int end ){if(begin==end)return;int mid =(begin+end)/2;sort(a,begin,mid);sort(a,mid+1,end);merge(a,begin,mid,end);}private static void merge(Comparable[] a, int begin, int mid, int end) {int i=begin;int j=mid+1;for (int k = begin; k<end+1; k++) //将要归并的部分拷贝到辅助数组aux[k]=a[k];}for (int k = begin; k <end+1; k++) {//两个有序数组的合并 (值得细看)if(i>mid) a[k]=aux[j++];else if(j>end) a[k]=aux[i++];else a[k]=less(aux[i], aux[j])?aux[i++]:aux[j++];}}public static void main(String[] args) {Comparable[] a=generateArray(15);aux = new Integer[a.length];sort(a, 0, a.length-1);show(a);System.out.println(isSorted(a));}}</span>
result:
1014 29 157 173 278 552 671 764 803 823 849 872 922 982true
sort方法里面的步骤如下:
1.将数组一分为二
2.对左边数组使用归并排序
3.对右边数组使用归并排序
4.将左右数组合并(merge)
merge方法是归并排序中的难点,要注意的是:我们得借用辅助数组,因为左右数组的归并要借用辅助数组才能较好的完成
归并排序的时间复杂度:
一分为二分到底 时间复杂度为O(log n)
merge过程 时间复杂度为O(n)
故为O(nlog n)
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 【LeetCode】【Python题解】Single NumberII
- 黑_马_程_序_员_文件读取的一种方法
- Brave Game+hdu+巴什博弈
- Python中缀表达式求值
- (输入年月日,输出是这一年的第几天)c语言程序
- 归并排序
- 初来乍到
- 微信及其朋友圈集成步骤
- pax wicket下手工mount page
- 让小屏幕kindlePaperWhite2支持PDF
- framebuffer设备的参数 和framebuffer编程
- framebuffer / 像素深度 / 颜色深度 / RGB565
- 游戏开发记录
- UVA 10779 Collectors Problem 网络流+建图