高级排序 --- 归并排序(常见经典排序算法)

简介: 高级排序 --- 归并排序(常见经典排序算法)

步骤:1. 将序列中待排序数字分为若干组,每个数字分为一组

          2. 将若干个组两两合并,保证合并后的组是有序的

          3. 重复第二步操作直到只剩下一组,排序完成

 

基本思路:归并排序,先将数组进行拆分,每次拆成两份,然后继续拆分直到一组有两个元素为止,然后再进行两两整合排序,重复两两整合排序直至数组元素排序完成。

 

平均时间复杂度:image.png

两组两组整合过程如下图所示:


 image.png

image.png

 image.png

image.png

 

import java.util.Arrays;
//归并排序:先分再合
public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {3,1,4,6,22,0,33,2,745,5,56,8};
        int[] temp = new int[arr.length];
        System.out.println("未排序数组:"+ Arrays.toString(arr));
        mergeSort(arr,0,arr.length-1,temp);
        System.out.println("已排序数组:"+ Arrays.toString(arr));
    }
    /**
     *arr:待排序数组
     *left:左边索引
     *right:右边索引
     *temp:临时数组存放
     */
    //mergeSort()方法:将数组分组出来
    public static void mergeSort(int[] arr,int left,int right,int[] temp){
        //将数组进行分组
        if (left < right){
            int l = left;
            int r = right;
            int middle = (l+r)/2;
            //将分组进行排序整合
            merge(arr,left,middle,right,temp);//将左边的部分继续分
            mergeSort(arr,0,middle,temp);//将右边的部分继续分
            mergeSort(arr,middle+1,r,temp);
        }
    }
    public static void merge(int[] arr,int left,int middle,int right,int[] temp){
        int l = left;
        int r = middle+1;
        int t = 0;//用于临时数组下标索引
        while(l <= middle && r <= right){
            //先将两个部分整合
            temp[t++] = arr[l] <= arr[r]?arr[l++] : arr[r++];
//            if (arr[l] <= arr[r]){
//                temp[t] = arr[l];
//                t++;l++;
//            }else{
//                temp[t] = arr[r];
//                t++;r++;
//            }
        }
        //如果左边的部分还有元素没有被合并,则接着l继续合并
        while(l <= middle){
            temp[t++] = arr[l++];
//            temp[t] = arr[l];
//            t++;l++;
        }
        //如果右边的部分还有元素没有被合并,则接着r继续合并
        while (r <= right){
            temp[t++] = arr[r++];
//            temp[t] = arr[r];
//            t++;r++;
        }
        //将temp临时数组中的元素顺序传到arr数组中
        t = 0;
        int tempLeft = left;
        while(tempLeft <= right){
            arr[tempLeft] = temp[t];
            tempLeft++;t++;
        }
    }
}

 

相关文章
|
3天前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
1天前
|
存储 算法
算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)
算法BFS经典例题(迷宫,多源BFS,BFS解决拓扑排序,FloodFill算法)
|
1天前
|
存储 算法 Java
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
6 1
|
3天前
|
搜索推荐 算法 Java
【Java基础】 几种简单的算法排序
几种简单的JAVA算法排序
21 4
|
7天前
|
存储 搜索推荐 算法
归并排序算法深入解析
归并排序算法深入解析
|
13天前
|
人工智能 算法 C++
c++算法学习笔记 (2)归并排序
c++算法学习笔记 (2)归并排序
|
14天前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
12 1
C语言数据结构算法,常用10种排序实战
|
16天前
|
算法 搜索推荐
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
【算法基础】基础算法(一)--(快速排序、归并排序、二分)
|
17天前
|
存储 算法 搜索推荐
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)(下)
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)
21 1
|
17天前
|
算法 编译器
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)(中)
数据结构与算法⑰(第五章_八大排序)(完整代码+动图+详解+对比)
35 4