归并排序

归并排序

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 }
归并排序

 

posted @ 2019-11-12 11:08  懒人写博客  阅读(...)  评论(...编辑  收藏