zoukankan      html  css  js  c++  java
  • 常用排序算法-归并排序

    简介

      归并排序算法是基于归并操作的一种有效排序算法,是采用分治法的典型应用。归并排序算法将待排序序列分为若干个子序列,先对每个子序列进行排序,等每个子序列都有序后,再将有序子序列合并为整体的有序序列,若将两个有序表合并为一个有序表,则称之为二路归并。

    原理

      归并排序的原理是将原始数组分解为多个子序列,然后对每个子序列进行排序,最后将排好序的子序列合并起来。

    程序

    public class MergeSort {
        public static void sort(int[] arr){
            mergeSort(arr, 0, arr.length - 1);
        }
    
        private static void mergeSort(int[] arr, int left, int right){
            if(left >= right)
                return;
            int mid = left + (right - left) / 2;
            mergeSort(arr, left, mid);
            mergeSort(arr, mid+1, right);
            merge(arr, left, mid, right);
        }
        private static void merge(int[] arr, int left, int mid, int right){
            int[] tempArr = new int[right-left+1];
            int index = 0;
            int l = left, r = mid+1;
            while(l <= mid && r <= right){
                if(arr[l] <= arr[r])
                    tempArr[index++] = arr[l++];
                else
                    tempArr[index++] = arr[r++];
            }
            while(l <= mid)
                tempArr[index++] = arr[l++];
            while(r <= right)
                tempArr[index++] = arr[r++];
            for(int i = 0; i < tempArr.length; ++i)
                arr[left+i] = tempArr[i];
        }
    }

    总结

    归并排序的时间复杂度最差为O(nlogn),最好情况时O(nlogn),平均时间复杂度为O(nlogn)。

    归并排序空间复杂度O(n),因为需要临时数组保存合并的结果。

    在序列合并的过程中,如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,所以,归并排序也是稳定的。

  • 相关阅读:
    python模块搜索路径
    Python数据结构
    Python文件类型
    Python循环语句
    Python条件语句
    python配置文件操作——configparser模块
    python 加密方式(MD5&sha&hashlib)
    python MySQL 获取全部数据库(DATABASE)名、表(TABLE)名
    python sqlite3查看数据库所有表(table)
    027.MFC_映射消息
  • 原文地址:https://www.cnblogs.com/silentteller/p/12791295.html
Copyright © 2011-2022 走看看