排序算法:归并排序

简介: 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为:
1)划分子表
2)合并半子表

package cn.hncu;

import javax.swing.text.DefaultEditorKit.CopyAction;

public class MergeSort {
    public static void main(String[] args) {
        int a[]= new int[100];

        for(int i=0;i<a.length;i++){
            a[i]=(int)(Math.random()*(a.length));
            //System.out.println(a[i]);
        }
        mergrSort(a,0,a.length-1);

        print(a);

    }

    private static void print(int[] a) {
        for(int i=0;i<a.length-1;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println(a[a.length-1]);
    }

    public  static void mergrSort(int a[],int left,int right){

        if(left<right){
            // 1、先分解
            //把整个数组分解成:[left,mid]和[mid+1,right]
            int mid = (left+right)/2;
            mergrSort(a,left,mid);
            mergrSort(a,mid+1,right);


            //2、归并
            int b[] = new int[a.length];

            merge(a,b,left,mid,right);


            //把辅助序列b中的数据复制到数组a当中
            copyArray(a,b,left,right);
        }

    }

    private static void merge(int[] a, int[] b, int left, int mid, int right) {
        int p = left;//游标遍历a[left,mid]
        int r = mid+1;//游标遍历a[mid+1,right]

        int k = left;//元素放入新数组的当前的位置(判断后)
        //游标遍历合并后的结果数组
        while(p<=mid&&r<=right){
            if(a[p]<a[r]){
                b[k]=a[p++];
            }else{
                b[k]=a[r++];
            }
            k++;
        }

        //把其中一个子序列当中剩余的元素直接照搬到归并结果数组当中
        if(p>mid){
            //左序列已完成合并,剩下的是右序列(照搬)
            for(int i=r;i<=right;i++){
                b[k]=a[i];
                k++;
            }

        }else{
            for(int i=p;i<=mid;i++){
                b[k++]=a[i];
            }

        }


    }

    private static void copyArray(int[] a, int[] b, int left, int right) {
        for(int i=left;i<=right;i++){
            a[i]=b[i];
        }

    }

}
目录
相关文章
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
144 0
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
78 0
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
335 1
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
197 0
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
225 0
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
109 0
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
134 4
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
161 0

热门文章

最新文章