• 归并排序


    归并排序

    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 }
    归并排序
  • 相关阅读:
    Unity文件操作路径
    自定义协议封装包头、包体
    完全卸载删除gitlab
    shell脚本报错:syntax error: unexpected end of file
    Shell脚本创建的文件夹末尾有两个问号怎么回事?
    您与此网站之间建立的连接并非完全安全
    linux 查看磁盘文件大小
    mysql连接问题
    Linux查看当前开放的端口
    本地Linux备份服务器[Client]定期备份云服务器[Server]上的文件(下)
  • 原文地址:https://www.cnblogs.com/zqr99/p/11840539.html
Copyright © 2020-2023  润新知