排序算法之归并排序
2020-01-15 08:13
26 查看
文章目录
原理
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
实现
public class GuiBing { static int n=1; public void sort(int [] a,int left,int right) { if(left==right) return; int middle=(left+right)>>1; System.out.println((n++)+" middle="+middle); for (int i : a) { System.out.print(i+" "); } System.out.println(); sort(a, left, middle); sort(a, middle+1, right); merge(a,left,middle,right); } public void merge(int [] a,int left,int middle,int right) { System.out.println("++++++++进入merge+++++++++++++++++"); int[] tmp=new int[right-left+1]; int pl=left; int pr=middle+1; int i=0; while(pl<=middle && pr<=right) { tmp[i++]=a[pl]<a[pr]?a[pl++]:a[pr++]; } while(pl<=middle) { tmp[i++]=a[pl++]; } while(pr<=right) { tmp[i++]=a[pr++]; } for(int m=0;m<tmp.length;m++) { a[left+m]=tmp[m]; } for (int k : tmp) { System.out.print(k+" "); } System.out.println(); System.out.println("++++++++退出merge+++++++++++++++++"); } public static void main(String[] args) { int [] a= new int[]{10,6,3,5}; GuiBing guiBing = new GuiBing(); int left=0; int right=a.length-1; guiBing.sort(a, left, right); for (int i : a) { System.out.print(i+" "); } } }
总结
稳定性:
因为交换元素时,可以在相等的情况下做出不移动的限制,
所以归并排序是可以稳定的。
时间复杂度:
每一层的时间复杂度是O(N),层数是logN,因此,时间复杂度是O(NlogN)。
空间复杂度:
归并排序每次递归需要用到一个辅助表,长度与待排序的表相等,虽然递归次数是O(log2n),
但每次递归都会释放掉所占的辅助空间,所以下次递归的栈空间和辅助空间与这部分释放的空间就不相关了,因而空间复杂度还是O(n)。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- (二)几种排序算法的学习总结(归并排序)
- 【算法】排序算法第四讲:归并排序
- 排序算法(直接插入,堆排,归并排序)
- 排序算法之 —— 归并排序(六)
- 排序算法之归并排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 排序算法详解【归并排序-Merge_Sort】
- 【十八】排序算法(四)--归并排序
- python排序算法-冒泡排序,选择排序,直接插入排序,希尔排序,归并排序,快速排序,堆排序
- 排序算法之归并排序
- 排序算法--归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 算法 排序算法之归并排序 java实现
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 常用算法--基本排序算法(冒泡排序,选择排序,插入排序,快速排序,归并排序,桶排序)
- ?未检查 Java排序算法大整理——归并排序