数组之归并排序

数组之归并排序

归并排序算法思想:归并排序就是利用归并的思想实现排序的方法,它的原理是假设初始序列有N个记录,则可以看成是N个有序的子序列,每个子序列的长度为1,然后两两归并,得到N/2个长度为2或1的有序子序列,再两两合并...如此重复,直到得到一个长度为N的有序序列为止,这种排序方法称为2路归并排序。

代码实现

package com.sun.base.Array.text;

import java.util.Arrays;

/**
 * @Author: fei
 * @CreateTime:2020-11-26
 */
public class Demo08 {
    public static void main(String[] args) {
        int[] arr = new int[]{8,9,5,-7,55,2,99,400,-7,25};
        mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //归并排序
    private static void mergeSort(int[] arr, int startIndex, int endIndex) {
        int centerIndex = (startIndex+endIndex)/2;
        //拆分、递归、归并(先拆再并)
        if(startIndex<endIndex){
            mergeSort(arr,startIndex,centerIndex);
            mergeSort(arr,centerIndex+1,endIndex);
            merge(arr,startIndex,centerIndex,endIndex);
        }
    }
    //归并
    private static void merge(int[] arr, int startIndex, int centerIndex, int endIndex) {
        //定义临时数组
        int[] tempArr=new int[endIndex-startIndex+1];
        //定义左边数组的起始索引
        int i=startIndex;
        //定义右边数组的起始索引
        int j=centerIndex+1;
        //定义临时数组的起始索引
        int index = 0;
        //比较两个数组的元素大小,小的放入临时数组中
        while (i<=centerIndex&&j<=endIndex){
            if(arr[i]<=arr[j]){
                tempArr[index]=arr[i];
                i++;
            }else {
                tempArr[index]=arr[j];
                j++;
            }
            index++;
        }
        //处理剩余元素
        while (i<=centerIndex){
            tempArr[index]=arr[i];
            i++;
            index++;
        }
        while (j<=endIndex){
            tempArr[index]=arr[j];
            j++;
            index++;
        }
        //将临时数组中的元素取到元素数组中
        for (int k = 0; k < tempArr.length; k++) {
            arr[k+startIndex]=tempArr[k];
        }
    }
}

运行

posted @ 2020-11-30 20:23  某人很酷  阅读(190)  评论(0)    收藏  举报