归并排序

来源:互联网 发布:佳能288清零软件 编辑:程序博客网 时间:2024/06/03 05:25

归并排序:先使每个子序列有序看,再使 子序列段 有序;将已有序的子序列合并,得到的完全的序列;若将两个有序表合并成一个有序表,称为二路归并。

package dong.test;import java.util.Arrays;public class MergeSort {    public static void Sort(int[] arr){        int length = arr.length;        Sort(arr,0,length-1);    }    //递归    private static void Sort(int[] arr, int l, int r) {        if(l>=r){//分解到一个元素的时候返回            return;        }        int mid = (l+r)/2;        Sort(arr,l,mid);//排序左边的元素        Sort(arr,mid+1,r);//排序右边的元素        Merge(arr,l,mid,r);//归并    }    private static void Merge(int[] arr, int l, int mid, int r) {        //复制待排序的元素块到数组aux         int[] aux = Arrays.copyOfRange(arr, l, r+1);         //初始化让i指向左半部分的起始位置的索引;j指向右半部分的起始位置的索引位置mid+1         int i = l,j = mid+1;         for(int k=l;k<=r;k++){             //如果左半部分元素已经全部处理完毕             if(i>mid){                 arr[k] = aux[j-l];                 j++;             }             //如果右半部分元素已经全部处理             else if(j>r){                 arr[k] = aux[i-l];i++;             }             //左半部分所指的元素 < 右半部分所指的元素             else if(aux[i-l]<aux[j-l]){                 arr[k]=aux[i-l];                 i++;             }else{//左半部分所指的元素 >= 右半部分所指的元素                 arr[k]=aux[j-l];                 j++;             }         }    }    public static void main(String[] args) {        int[] arr = {10,4,6,3,8,2,5,7};        MergeSort.Sort(arr);        for(int a :arr){            System.out.print(a+" ");        }    }}

这里写图片描述