排序算法-归并排序(Java)

package com.rao.sort;

import java.util.Arrays;

/** * @author Srao * @className MergeSort * @date 2019/12/7 10:24 * @package com.rao.sort * @Description 归并排序 */public class MergeSort {    /**     * 归并排序:递归写法     * @param arr:要排序的数组     * @param left:数组最左边的元素的下标     * @param right:数组最右边的元素的下标     */    public static int[] mergeSort(int[] arr, int left, int right){        //如果left == right,那么说明数组中只有一个元素了        if (left < right){            int mid = (left + right) / 2;            arr = mergeSort(arr, left, mid);//对左边的部分进行归并排序            arr = mergeSort(arr, mid+1, right);//对右边的部分进行归并排序            merge(arr, left, mid, right);//将上面两部分进行合并,变成一个有序的数组        }        return arr;    }

    /**     * 归并排序:非递归写法     * @param arr:要排序的数组     * @return     */    public static int[] mergeSort2(int[] arr){        int n = arr.length;        //分组时每一轮数组的长度为1,2,4,8,16....        for (int i = 1; i < n; i = i+i){            int left = 0;            int mid = left + i - 1;            int right = mid + i;            while (right < n){                merge(arr, left, mid, right);                left = right + 1;                mid = left + i -1;                right = mid + i;            }

            //每一次分组合并之后可能会有多余的数组,不够2,4,8...,要把他们也合并到数组里面来            if (left < n && mid < n){                merge(arr, left, mid, n-1);            }        }        return arr;    }

    /**     * 对数组进行合并     * @param arr:要操作的数组     * @param left:从left到right之间进行合并     * @param mid     * @param right     */    private static void merge(int[] arr, int left, int mid, int right) {        int i = left;//左边部分的起始下标        int j = mid+1;//右边部分的起始下标        int k = 0;//新数组的下标,新数组用来存放排好序的数字        int[] a = new int[right-left+1];//新数组        while (i <= mid && j <= right){            if (arr[i] < arr[j]){                a[k] = arr[i];                k++;                i++;            }else if (arr[i] >= arr[j]){                a[k] = arr[j];                k++;                j++;            }        }        //把没有排序的数字放入新数组        while (i <= mid){            a[k] = arr[i];            k++;            i++;        }        while (j <= right){            a[k] = arr[j];            k++;            j++;        }        //把新数组中的数字覆盖到旧数组中        for (int m = 0; m < a.length; m++){            arr[left+m] = a[m];        }    }

    public static void main(String[] args) {        int[] arr = {3, 6, 9, 5, 0};        System.out.println(Arrays.toString(arr));        arr = mergeSort(arr, 0, arr.length-1);        System.out.println(Arrays.toString(arr));

        int[] arr2 = {3, 6, 9, 5, 0};        System.out.println(Arrays.toString(arr2));        arr2 = mergeSort2(arr);        System.out.println(Arrays.toString(arr2));

    }}

归并排序的思想:

  把数组一分为二,对左右两边分别进行归并排序,一直往下递归,直到数组不能再分,此时数组中只有一个元素,且一个元素是有序的,再把左右两部分进行合并,一直递归合并成一个有序数组。

原文地址:https://www.cnblogs.com/rao11/p/12010444.html

时间: 2024-10-09 00:09:56

排序算法-归并排序(Java)的相关文章

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

[转]各种排序算法及其java程序实现

原文:http://blog.csdn.net/t12x3456/article/details/7430700 各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想: 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止.2. 排序过程: 设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

排序算法——归并排序

归并排序是分治法的典型举例. 分治法的思想是,将原有问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. 解决这些子问题,递归地求解各子问题.然而,若子问题的规模足够小,则直接求解. 合并这些子问题的解成原问题的解. 归并排序算法完全遵循分治模式.直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列. 解决:使用

经典排序算法 - 归并排序Merge sort

经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每一个步骤下的状态,完了再看合并细节 第一步 [6 2 4 1 5 9]原始状态 第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍 第三步 [1 2 4 6] [5 9]继续两组两组合并 第四步 [1 2 4 5 6 9]合并完成,排序完成 输出结

各排序算法的Java实现及简单分析

一,直接插入排序 //直接插入排序的算法时间复杂度分析: //如果输入为正序,则每次比较一次就可以找到元素最终位置,复杂度为O(n) //如果输入为反序,则每次要比较i个元素,复杂度为O(n2) //平均时间复杂度为O(n2) public static void straigthInsertSort(int[] num) { int n = num.length; for(int i = 1;i < n;i++)//从第二个开始向前插入 { int x = num[i]; int j; for

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

经典排序算法(Java版)

经典排序算法(Java版)  转载 1.冒泡排序 Bubble Sort最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡”序列处理若干遍.所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确.如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置.显然,处理一遍之后,“最轻”的元素就浮到了最高位置:处理二遍之后,“次轻”的元素就浮到了次高位