当前位置: 首页 > news >正文

排序算法之归并排序

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

具体步骤如下:

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

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

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

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

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

代码实现:

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 + " ");}}
}

http://www.mrgr.cn/news/40796.html

相关文章:

  • 【开源鸿蒙】OpenHarmony 5.0.0 发布了,速来下载最新代码
  • 中国电信解锁万亿参数大模型:TeleAI的创新与突破
  • 2024年寒假开学赛题解
  • 10.数据结构与算法-线性表的应用(线性表与有序表的合并)
  • MQ高级:RabbitMQ小细节
  • 期权卖方怎么选择权利金高的品种,期货VIX高低对行情有什么影响
  • python 实现knapsack背包问题算法
  • Egg.js 系列(1):Egg是什么、快速入门、目录结构
  • C++入门(有C语言基础)
  • SpringMVC——REST
  • 车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
  • MySQL表的约束
  • JS+HTML基础
  • 性能微基准测试JMH
  • windows系统控制面板里面卸载软件的时候,出现invalid uninstall control file错误怎么办
  • 初始C语言(五)
  • 基础算法--双指针【概念+图解+题解+解释】
  • Qt界面优化——QSS
  • Nginx基础详解4(location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖)
  • 【Python报错已解决】KeyError: ‘key‘