排序算法之归并排序

归并排序是一种分治算法,它将一个数组分成两个子数组,然后递归地对子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。

具体步骤如下:

  1. 将数组不断地拆分成两个子数组,直到每个子数组只有一个元素。
  2. 对每个子数组进行合并排序,即将两个有序的子数组合并成一个有序的数组。
  3. 重复步骤2,直到所有子数组都合并成一个有序的数组。

合并排序的关键在于合并操作。合并操作的步骤如下:

  1. 创建一个临时数组,用于存放合并后的有序数组。
  2. 使用三个指针,分别指向左子数组、右子数组和临时数组的位置。
  3. 比较左子数组和右子数组的元素,将较小的元素放入临时数组,并将对应指针向后移动一位。
  4. 重复步骤3,直到左子数组或右子数组的元素全部放入临时数组。
  5. 将剩余的元素依次放入临时数组。
  6. 将临时数组的元素复制回原数组的对应位置。

归并排序的时间复杂度是O(nlogn),其中n是数组的长度。它是一种稳定的排序算法,适用于各种数据类型的排序。

需要注意的是,在实际应用中,归并排序的空间复杂度较高,需要额外的空间来存储临时数组。如果对空间复杂度有要求,可以考虑使用其他排序算法。

代码实现:

java 复制代码
package com.lut.sort;

public class MergeSort {

    public static void sort(int[] arr,int left,int right){
        if(left < right){
            int mid = (left + right)/2;
            sort(arr,left,mid);
            sort(arr,mid+1,right);
            merge(arr,left,right,mid);
        }
    }

    private static void merge(int[] arr, int left, int right, int mid) {
        int[] temp = new int[right-left+1];
        int i = left;
        int j = mid + 1;
        int k = 0;
        while(i <= mid && j <= right){
            if(arr[i] < arr[j]){
                temp[k++] = arr[i++];
            }else{
                temp[k++] = arr[j++];
            }
        }
        while (i <= mid){
            temp[k++] = arr[i++];
        }
        while (j <= right){
            temp[k++] = arr[j++];
        }
        for (int count = 0; count < temp.length; count++) {
            arr[left+count] = temp[count];
        }
    }

    public static void main(String[] args) {
        int[] arr = {3,4,1,8,0,7,1,6};
        sort(arr, 0, arr.length - 1);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}
相关推荐
Fantasydg几秒前
DAY 35 leetcode 202--哈希表.快乐数
算法·leetcode·散列表
jyyyx的算法博客1 分钟前
Leetcode 2337 -- 双指针 | 脑筋急转弯
算法·leetcode
SweetCode13 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…26 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong27 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh1 小时前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L1 小时前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法