归并排序:使用的是分而治之的思想,将大问题分解成小的子问题来解决,比如用归并排序来对一个数组进行排序,首先把数组从中间分成前后两部分,然后对它们分别排序,再将排好序的两部分合并在一起,这样整个数组就有序了。 任何情况下都是O(nlogn),在合并两个有序数组为一个有序数组时,需要借助额外的存储空间,n/2,n/4,…,1 ,所以空间复杂度为 O(n)。稳定。 public void mergeSort ( int [ ] a ) { int n = a . length ; if ( n <= 1 ) { return ; } merge ( a , 0 , n - 1 ) ; } private void merge ( int [ ] a , int l , int r ) { if ( l >= r ) { return ; } int mid = l + ( ( r - l ) >> 1 ) ; merge ( a , l , mid ) ; merge ( a , mid + 1 , r ) ; mergeTwo ( a , l , mid , r ) ; } private void mergeTwo ( int [ ] a , int l , int mid , int r ) { int [ ] tmp = new int [ r - l + 1 ] ; int i