归并排序
归并排序
3 5 1 8 4
先将数组分成
先将左边和右边分别排好序
再利用类似外排的方式把整体排序:
左边1<右边4 :1
左边移动指针到3,左边3<右边4: 1 3
左边移动指针到5,左边5>右边4: 1 3 4
右边移动指针到8,左边5<右边8: 1 3 4 5
左边全部用完,把右边一次放进排好序的数组: 1 3 4 5 8
1 package com.sort.demo; 2 3 public class Mergesort extends Sort { 4 5 @Override 6 public void sort(int[] arr) { 7 if (arr==null||arr.length<2) return; 8 processSort(arr,0,arr.length-1); 9 } 10 11 public void processSort(int[] arr, int L, int R) { 12 if (L == R) 13 return; 14 int mid = (L + R) / 2; 15 //左边排序 16 processSort(arr, L, mid); 17 //右边排序 18 processSort(arr, mid + 1, R); 19 merge(arr,L,mid,R); 20 } 21 22 public void merge(int[] arr, int L, int mid, int R) { 23 24 if (arr==null||arr.length<2) return; 25 int[] help=new int[R-L+1]; 26 int i=0; 27 int p1=L; 28 int p2=mid+1; 29 //左右两边的有序数组都不越界 30 while (p1<=mid&&p2<=R){ 31 help[i++]=arr[p1]>arr[p2]?arr[p2++]:arr[p1++]; 32 } 33 //右边越界,左边依次copy到结果数组 34 while (p1<=mid){ 35 help[i++]=arr[p1++]; 36 } 37 // 左边越界,右边依次copy到结果数组 38 while (p2<=R){ 39 help[i++]=arr[p2++]; 40 } 41 //再copy回原数组 42 for(i=0;i<help.length;i++){ 43 // 很容易出错的地址,这个地方应该是L+i,而不是i,因为从arr的L到R合并 44 arr[L+i]=help[i]; 45 } 46 } 47 48 public static void main(String[] args) { 49 Mergesort sort=new Mergesort(); 50 Test.test(sort); 51 } 52 }