算法

04-归并排序

2021-09-04  本文已影响0人  唔哒喂

将一组数据先进行分组,取index中间值。直到每组只剩下一个数字。
之后按顺序(从小到大)合并。
采用递归进行分。

完整代码见文末

分组函数

public static void MergeSort(int[] arr, int L, int R)

排序函数

public static void merge(int[] arr, int L, int R, int mid)

分组

例子:
Arr={10, 3, 8, 4}
这组数据使用归并排序。
Value: 10, 3, 8,4
Index: 0, 1, 2,3

开始分组
L = 0; R=3;
将四个数字分组
获取中间值 mid = (L + R) / 2 = 1
那么已经分为了两组
0 - mid,
mid + 1 - R

即每次分组需确认的是mid值

int mid = (L + R) / 2;

左边:
Value:10, 3
Index: 0, 1
右边:
Value:8,4
Index:2,3

左边再分:
L = 0, R = 1; mid = 0
左:
Value:10
Index: 0
右:
Value:3
Index:1

右侧同理。
将一组数分到每组一个数据需要重复取mid值

        int mid = (L + R) / 2;
        MergeSort(arr, L, mid);
        MergeSort(arr, mid + 1, R);

每次分组都先要保证L和R不再

已经分到一个数据一组,开始合并。

最先进行合并的是 10 和 3

合并

合并的方法及参数为

public static void merge(int[] arr, int L, int R, int mid)

创建一个temp[]来根据大小存放合并的两组数。

        int l = L;//分组1的索引
        int m = mid + 1;//分组2的索引
        int[] temp = new int[arr.length];
        int tempInd = l;

遍历比较两组数,根据顺序存放进temp[]

 while (l <= mid && m <= R){
            if (arr[l] < arr[m])
                temp[tempInd++] = arr[l++];
            else
                temp[tempInd++] = arr[m++];
        }

将未存放进temp[]的数组1或数组2中的数据,进行处理。

        while (l <= mid)
            temp[tempInd++] = arr[l++];

        while(m <= R)
            temp[tempInd++] = arr[m++];

最后根据temp[]中的数据修改array[],索引即为L和R

for (int i = L; i <= R; i++)
            arr[i] = temp[i];

完整代码

public static void merge(int[] arr, int L, int R, int mid){
//        从小到大
        int l = L;
        int m = mid + 1;
        int[] temp = new int[arr.length];
        int tempInd = l;
        while (l <= mid && m <= R){
            if (arr[l] < arr[m])
                temp[tempInd++] = arr[l++];
            else
                temp[tempInd++] = arr[m++];
        }
        while (l <= mid)
            temp[tempInd++] = arr[l++];

        while(m <= R)
            temp[tempInd++] = arr[m++];

        for (int i = L; i <= R; i++)
            arr[i] = temp[i];

        System.out.println(Arrays.toString(temp));
    }

    public static void MergeSort(int[] arr, int L, int R){
        if (L == R)
            return;

        int mid = (L + R) / 2;
        MergeSort(arr, L, mid);
        MergeSort(arr, mid + 1, R);
        merge(arr, L, R, mid);
    }
上一篇 下一篇

猜你喜欢

热点阅读