归并排序--数据结构排序(JAVA)

归并排序介绍:

归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。
:分治法将问题(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之。

归并排序思想示意图1-基本思想:

在这里插入图片描述

归并排序思想示意图2-合并相邻有序子序列:

在这里插入图片描述


代码实现:
先从合的代码开始理解

import java.util.Arrays;
public class MergetSort {
    public static void main(String args[]){
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);

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

    //分+合的方法
    public static void mergeSort(int[] arr, int left, int right, int[] temp){
        if (left < right){
            int mid = (left + right) / 2;
            //向左递归
            mergeSort(arr, left, mid, temp);
            //向右递归
            mergeSort(arr, mid + 1, right, temp);
            //合并
            merge(arr, left, mid, right, temp);
        }

    }




    // 合并的方法
    public static void merge(int[] arr, int left, int mid, int right, int[] temp){
        int i = left;
        int j = mid + 1;
        int t = 0;

//        (一)
//        先把左右两边(有序的)数据按照规则填充到temp数组
//        直到左右两边的有序序列,有一边处理完毕为止
        while (i <= mid && j <= right){
            if (arr[i] <= arr[j]){
                temp[t] = arr[i];
                t += 1;
                i += 1;
            }else {
                temp[t] = arr[j];
                t += 1;
                j += 1;
            }
        }
        //(二)
        //把有剩余数据的一边的数据依次全部填充到temp
        while (i <= mid){
            temp[t] = arr[i];
            t += 1;
            i += 1;
        }
        while (j <= right){
            temp[t] = arr[j];
            t += 1;
            j += 1;
        }

        //将temp数据拷到arr

        t = 0;
        int templeft = left;
        while (templeft <= right){
            arr[templeft] = temp[t];
            t += 1;
            templeft += 1;
        }
    }

}
发布了7 篇原创文章 · 获赞 0 · 访问量 44

猜你喜欢

转载自blog.csdn.net/weixin_43608645/article/details/104382243