排序算法——归并排序(mergeSort)

归并排序

  归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

排序原理

  1. 尽可能的一组数据拆分成两个元素相等的子组并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。
  2. 将相邻的两个子组进行合并成一个有序的大组
  3. 不断的重复步骤2,直到最终只有一个组为止。
    排序算法——归并排序(mergeSort)_第1张图片

归并原理

排序算法——归并排序(mergeSort)_第2张图片 排序算法——归并排序(mergeSort)_第3张图片

排序算法——归并排序(mergeSort)_第4张图片
排序算法——归并排序(mergeSort)_第5张图片

代码实现

	//定义辅助数组assist
    private static double[]assist=new double[100];

    //对所有数组元素进行排序
    public static void mergeSort(double a[]){

        //定义low,high变量,分别记录数组中的最小索引和最大索引
        int low=0;
        int high=a.length-1;
        //调用重载方法,进行排序
        mergeSort(a,low,high);
    }

    //对数组中从索引low到索引high的元素进行排序
    private static void mergeSort(double a[],int low,int high){
        //安全检验
        if(low>=high)
            return;
        //对low到high的元素分成两组
        int mid= (low+high)/2;

        //分别对每一组进行排序
        mergeSort(a,low,mid);
        mergeSort(a,mid+1,high);

        //再把两组的数据进行归并
        merge(a,low,mid,high);
    }

    //交换数组i和j元素的位置
    private static void exchange(double a[],int i,int j){
        double temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    //对数组中Low到mid为一组,mid+1到high位一组,对这两组数据进行归并
    private static void  merge(double a[],int low,int mid,int high){

        //定义三个指针
        int i=low;
        int p1=low;
        int p2=mid+1;

        //遍历,移动p1,p2指针,比较对应的值,找出小的那个,放到辅助数组assist[]中,直到其中一个指针走完
        while (p1<=mid && p2<=high){
            //比较
            if(a[p1]<=a[p2]){
                assist[i++]=a[p1++];
            }
            else {
                assist[i++]=a[p2++];
            }
        }

        //以下while循环只会进行一个
        //遍历,如果p1指针没有走完,那么顺序移动p1指针,把对应元素移到指定数组中
        while (p1<=mid){
            assist[i++]=a[p1++];
        }
        //遍历,如果p2指针没有走完,那么顺序移动p2指针,把对应元素移到指定数组中
        while (p2<=high){
            assist[i++]=a[p2++];
        }

        //把辅助数组拷贝到原数组中
        for (int j=low;j<=high;j++){
            a[j]=assist[j];
        }
    }

测试:

 public static void main(String[] args) {
        double arr[]={4,5,3,6,11,14,1,8};
        mergeSort(arr);
        System.out.println(Arrays.toString(arr));//import java.util.Arrays;
        //[1.0, 3.0, 4.0, 5.0, 6.0, 8.0, 11.0, 14.0]
    }

算法分析

  归并排序在归并的过程中,只有arr[i]归并排序是稳定的。
  排序算法——归并排序(mergeSort)_第6张图片

你可能感兴趣的:(算法)