归并排序:
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。
归并排序先拆后排 逐渐扩大 长度
代码
import java.util.Arrays; public class MergeSort { public static void mergesort(int[] arr,int left,int right){ if(left==right){ return; } mergesort(arr,left,(left+right)/2); mergesort(arr,(left+right)/2+1,right); merge(arr,left,(left+right)/2,right); } public static void merge(int[] arr,int left,int mid,int right){ int s1 = left; int s2 = mid+1; int idenx = 0; int[] res = new int[right-left+1]; while(s1<=mid&&s2<=right){ if(arr[s1]<arr[s2]){ res[idenx++] = arr[s1++]; } if(arr[s1]>arr[s2]){ res[idenx++] = arr[s2++]; } } while(s1<=mid){ res[idenx++] = arr[s1++]; } while(s2<=right){ res[idenx++] = arr[s2++]; }//把新数组拷回arr里 从哪拿的就从哪拷回去 每一段都有每一段的left System.arraycopy(res,0,arr,left,res.length); } public static void main(String[] args) { int[] arr = new int[]{1,4,3,2,7,6,8,9}; System.out.println(Arrays.toString(arr)); mergesort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } }