归并排序java(内附超详解图文讲解)

归并(合并)排序算法(Java实现) 归并排序算法的思想,实现步骤,二路归并算法步骤,二路归并排序算法代码实现(Java) 阅读详情

目录

归并排序介绍:

归并排序图解:

示意图1

示意图2

归并排序详细步骤:

1.组合

2.分组

完整代码



归并排序介绍:


归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide- and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

归并排序图解:

示意图1


归并排序思想示意图1-基本思想:

示意图2

归并排序思想示意图2-合并相邻有序子序列:
再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后- -次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤:

归并排序详细步骤:

归并排序的应用实例:
给你一个数组,  arr= Array(8, 4,5,7, 1,3,6,2),请使用归并排序完成排序。

为了便于大家理解 我把步骤分开:

先把最难的组合部分写完

1.组合

1.我们先写黑框的代码,也就是数组已经成为(4, 5,7,8, 1,2,3,6) 我们如何把它合成1 2 3 4 5 6 7 8

可以看一下示意图2

package suanfa;

import java.util.Arrays;
import java.util.Scanner;

public class xishuarr {
	
	public static void main(String[] args) {
		int arr[]= {8,4,5,7,1,3,6,2};
		
		//假设已经到最后一步
		int arrys[]= {4 ,5 ,7 ,8,1 ,2, 3, 6};
		int[] add=new int[8];
		//第一个参数表示传入数组{4 ,5 ,7 ,8,1 ,2, 3, 6}
		//第二个参数表示这个数组的第一个位置 即是0
		//第三个参数表示这个数组的中间位置  (0+7)/2=3
		//第四个参数 存放临时数组的
		merge(arrys,0,3,7,add);
	  
		
	}
	
/**
 * 
 * @param arr  排序的原始数组
 * @param left  左边有序序列的初始索引
 * @param mid   中间索引
 * @param right    右边索引
 * @param temp    做中转的数组
 */
	
	//4 5 7 8   1 2 3 6
	public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
		int i=left;  //初始i,左边有序序列的初始索引
		int j=mid+1;  //初始j,右边有序序列的初始索引
		int t=0;       //指向temp数组的当前索引
		
		//1.
		//先把左右两边(有序)的数据按照规则填充到temp数组
		//直到左右两边的有序序列,有一边处理完毕为止
		while(i<=mid&&j<=right) {
			if(arr[i]<arr[j]) {
				temp[t]=arr[i++];
				/**
				 * 这里我们这里是:temp[t]=arr[i++];
				 * 如果不好理解,你可以写成这样:
				 * temp[t]=arr[i];i++;
				 */
				}
			else {
				temp[t]=arr[j++];
			}
			//因为无论执行if里面的语句还是else里面的语句,t都要加1,所以把t移出来.
		     t++;
		}
		
		//2.
		//把有剩余数据的一边的的数据依次全部填充到temp
		//由上述循环条件:i<=mid&&j<=right 可知 
		//此时要么要么j>right i>mid 
		while(i<=mid) {
			temp[t]=arr[i];
			t++;
			i++;
			
		}
		while(j<=right) {
			temp[t]=arr[j];
			t++;
			j++;
			
		}
		
		//3.
		//把temp的数组转移到arr上
		int n=0;
	   while(n<arr.length){
		   arr[n]=temp[n];
		   n++;
		   
	   }
	   System.out.println(Arrays.toString(arr));
		
		
		
	}
	
		

}

运行结果:

2.分组

写黑框里面的代码:

又回到初始,我们如何从把数组分成 黑框这样子呢?

 运用了递归的思想进行分:

方法:

	/**
	 * 分
	 * @param arr  排序的原始数组
	 * @param left  左边有序序列的初始索引
	
	 * @param right    右边索引
	 * @param temp    做中转的数组
	 */
		
	public static void mergeSort(int[] arr,int left,int right,int[] temp) {
		//求中间索引
		int mid=(left+right)/2;
		


		if(left<right) {
			//左边递归分解
			mergeSort(arr,left,mid,temp);
			
			//右边递归分解
			mergeSort(arr,mid+1,right,temp);
			
			System.out.println(" 最左边索引:"+left+"\t最右边边索引:"+right+"\t"+Arrays.toString(arr));
		}
	
	}
	

主函数:

	public static void main(String[] args) {
		int arr[]= {8,4,5,7,1,3,6,2};
		
		//假设已经到最后一步
		int arrys[]= {4 ,5 ,7 ,8,1 ,2, 3, 6};
		int[] add=new int[8];
		//第一个参数表示传入数组{4 ,5 ,7 ,8,1 ,2, 3, 6}
		//第二个参数表示这个数组的第一个位置 即是0
		//第三个参数表示这个数组的中间位置  (0+7)/2=3
		//第四个参数 存放临时数组的
//		merge(arrys,0,3,7,add);
		mergeSort(arr,0,7,add);
	  
		
	}

结果:

 

或许有一部分同学,看到 结果会有疑问。那就是 你递归基础比较差,别怕,我给你做详细讲解。

如果没有问题的,可以跳过以下疑问:

疑问1:为啥数组没有变化?

因为 我们只是分,而没有改变数组的位置

疑问2:为啥为输出7次?

如下图所示,我们总共分了7次,所以输出7次

 疑问3:最左边索引 和 最右边索引 是啥意思?

 这是为了方便大家理解 递归的顺序 特意加上去的

第一行的  左:0  右:1      表示:  最左边索引为:0  最右边索引为:1

然后你再看下图:

故此递归的顺序:

相信此时,同学们会加深对递归的顺序的了解

我们来,分析一下,我们完成的部分:

 我们完成了 数组 分 的部分,然后→   治(组合)  我们是把 2个含4个有序数字组合成 1个有序的数组。

我们可以把先前的   治(组合)从原来:把 2个含4个有序数字组合成 1个有序的数组。修改成:

把 2个含n个有序数字组合成 1个有序的数组

不理解的话,看图:

 这是我们开头组合的:

那么以下这2步 和上面那个图的区别在于:

上图:2个含有4个有序数字 组成一个有序数组

下2个图:2个含有2个有序数字 组成一个有序数组

故此:

 我们把之前只适用一种情况的代码修改成通用的

之前的:

通用的:

	
		//3.
		//把temp的数组转移到arr上
	   int n=0;
       int tempLeft=left;
	   while(tempLeft<=right){
		   arr[tempLeft]=temp[n];
		   n++;
		   tempLeft++;
		   
	   }

改好后我们在分的方法中 加入组合:

这样就能实现 每分一次 组合一次

完整代码

import java.util.Arrays;
import java.util.Scanner;

public class xishuarr {
	
	public static void main(String[] args) {
		int arr[]= {8,4,5,7,1,3,6,2};
	    int[] add=new int[arr.length];
	    System.out.println("排序前:"+Arrays.toString(arr));
	    System.out.println("排序过程:");
	    mergeSort(arr,0,add.length-1,add);
	    System.out.println("排序后:"+Arrays.toString(arr));
	    
	    }
	
	
	/**
	 * 分
	 * @param arr  排序的原始数组
	 * @param left  左边有序序列的初始索引
	
	 * @param right    右边索引
	 * @param temp    做中转的数组
	 */
		
	public static void mergeSort(int[] arr,int left,int right,int[] temp) {
		//求中间索引
		int mid=(left+right)/2;
		


		if(left<right) {
			//左边递归分解
			mergeSort(arr,left,mid,temp);
			
			//右边递归分解
			mergeSort(arr,mid+1,right,temp);
			
			merge(arr,left,mid,right,temp);
		
			
			System.out.println(" 最左边索引:"+left+"\t最右边边索引:"+right+"\t"+Arrays.toString(arr));
		}
	
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
/**
 * 
 * @param arr  排序的原始数组
 * @param left  左边有序序列的初始索引
 * @param mid   中间索引
 * @param right    右边索引
 * @param temp    做中转的数组
 */
	
	//4 5 7 8   1 2 3 6
	public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
		int i=left;  //初始i,左边有序序列的初始索引
		int j=mid+1;  //初始j,右边有序序列的初始索引
		int t=0;       //指向temp数组的当前索引
		
		//1.
		//先把左右两边(有序)的数据按照规则填充到temp数组
		//直到左右两边的有序序列,有一边处理完毕为止
		while(i<=mid&&j<=right) {
		
			if(arr[i]<arr[j]) {
				temp[t]=arr[i++];
				/**
				 * 这里我们这里是:temp[t]=arr[i++];
				 * 如果不好理解,你可以写成这样:
				 * temp[t]=arr[i];i++;
				 */
				}
			else {
				
				temp[t]=arr[j++];
			
			}
			//因为无论执行if里面的语句还是else里面的语句,t都要加1,所以把t移出来.
	
			t++;
		 	
		}
		
		//2.
		//把有剩余数据的一边的的数据依次全部填充到temp
		//由上述循环条件:i<=mid&&j<=right 可知 
		//此时要么i>mid 要么j>right
		while(i<=mid) {
			temp[t]=arr[i];
			t++;
			i++;
			
		}
		while(j<=right) {
			temp[t]=arr[j];
			t++;
			j++;
			
		}

		
		
		//3.
		//把temp的数组转移到arr上
	   int n=0;
       int tempLeft=left;
	   while(tempLeft<=right){
		   arr[tempLeft]=temp[n];
		   n++;
		   tempLeft++;
		   
	   }
	  

		
		
		
	}
	
		

}

结果:

来自:【尚硅谷】数据结构与算法(Java数据结构与算法)_哔哩哔哩_bilibili

十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序 归并排序、堆排序、计数排序、桶排序、基数排序 阅读详情

相关推荐

【排序算法】归并排序原理及Java实现

归并排序就是利用归并的思想实现的排序方法。而且充分利用了完全二叉树的深度特性,因此效率比较高。其基本原理如下:对于给定的一组记录,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序,最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。 经过第一轮比较后得到最小的记录,然后将该记录的位置与第一个记录的位置交换;接着对不包括第一个记录以外的其他记录进行第二次

简约人生的博客 5万+

java实现归并排序(详解)

归并排序和快速排序都是基于分而治之的算法思想。 归并排序先将待排序的数组不断拆分,直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们再想办法合并两个有序的数组,得到长度更长的有序数组。当前合并好的有序数组为下一轮得到更长的有序数组做好了准备。一层一层的合并回去,直到整个数组有序。

古城的博客 2万+

归并排序Java详解+例题

归并排序—>分治 归并排序归并排序—>分治背景归并原理与过程原理:过程图形展示模板代码模板讲解归并例子完整java代码 背景 归并排序是十大排序之一 十大排序: 归并原理与过程 原理: 取中值,将数组分成左右部分,分别对两边再次分成两个部分,一直到最终一边只有两个数,如何进行双指针从两端进行判定,若左端,比右端大,则交换两个位置的值。 过程 首先取数组中值,进行左右两边归并排序,调用递归。然后运用双指针算法(若不会,请看快速排序有讲解)判断两端的值,在适合条件下进行交换。最后完成所有区间的排序

JssenJ的博客 2080

Java归并排序

归并排序(Merge Sort)是应用分治思想的一个典型例子。把一个待排序序列拆分为两个子序列,分别对两个子序列排序,子序列排序时也采用相同的方法,直至拆分后的两个子序列都是有序的,即长度为1的序列天然有序,这时停止拆分,将两个有序的子序列归并为一个更大的有序序列,与之前拆分时的路径相反,不断的归并有序子序列,最终归并为一个序列。这种将两个有序序列归并为一个有序序列的操作称为二路归并。

qq_38875964的博客 4058

【AI】使用Cursor和AI编程生成的VUE前端框架

本项目是一个基于VUE.js的前端框架,结合了登录、图形验证码、权限校验等常用功能模块。通过与Cursor AI交互生成的代码,展示了AI在编程中的潜力与效率。

清欢渡的博客 9860

【技术实践指南】Python解析FactSet Revere供应链数据:构建企业级断裂与重构监测指标

本文提供了一份企业级Python实践指南,详细解析如何利用FactSet Revere供应链数据库,构建供应链断裂与重构监测指标。内容涵盖数据清洗、关系对筛选、时间序列处理及核心指标(断裂、恢复、转移)的工程化实现,旨在帮助数据工程师与分析师搭建自动化、可解释的供应链风险监控系统。

weixin_29051811的博客 925

归并排序+图文讲解+视频讲解+java实现

归并排序+图文讲解+视频讲解+java实现1.图文讲解2.视频讲解3.java代码 1.图文讲解 ① https://blog.youkuaiyun.com/jianyuerensheng/article/details/51262984 ② https://blog.youkuaiyun.com/MoreWindows/article/details/6678165 2.视频讲解 归并排序算法讲解 3.java代码 package com.algorithm.learn.sort08; import java.text.C

lightupworld的博客 484

SPI 总线信号完整性与时序一致性测试

SPI总线测试的核心目标是验证其电气与时序行为是否满足芯片规格要求,确保通信可靠性

硬核科技 328

Java【归并排序】算法, 大白话式图文解析(附代码)

学数据结构与算法怎么少得了排序? 七大排序算法之[归并排序]详细图解 , 结尾附[总体对比分析]

yzhcjl_的博客 3477

com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn‘t retrieve inbound binding

错误消息:错误截图:该错误通常表示在集成配置中,未找到与特定消息匹配的入站绑定(Inbound Binding)。具体而言,错误消息中的 P/S/A(Party/Service/Action)值未在配置中找到对应的入站绑定。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 373

uniApp微信小程序:error: 60001 request:fail errcode:-101 cronet error code:-101error_msg:net::ERR CONNECTI

uni-app微信小程序域名访问报error 60001 request:fail errcode:-101,解决Uniapp微信小程序报600001错误,uni.request()接口请求报错,服务器更换SSL证书后,uniapp微信小程序出现`request:fail errcode:-101`问题分析与解决,服务器更换ssl证书后,手机访问微信小程序异常,微信小程序更换SSL证书后出现请求报错,服务器更换SSL证书,微信小程序报600001,小程序反应偶尔出现request:fail errcode:

✅ 精选推荐文章 4580

归并排序详解

摘要:归并排序是我们常用的八大排序中的一种,其排序思路中和快速排序算法一样使用到了递归的思想,同时在归并排序中还用到了一个算法,就是有序数组合并算法。配合递归与有序数组合并算法,归并排序能够高效且稳定的完成排序,归并排序的优点在于其时间复杂度低,稳定性高,但是缺点也是有的,那就是空间复杂度很高。

云杉木屋 2万+

Detector-Free SfM 项目复现完整指南:从环境搭建到代码解析与可视化

本文提供了Detector-Free SfM项目的完整复现指南,涵盖技术背景、环境配置、代码解析和可视化方案。重点包括: 技术背景:Detector-Free SfM通过两阶段策略(粗重建+迭代精化)解决了传统SfM在弱纹理区域的瓶颈问题,采用深度学习匹配器替代传统特征点检测。 环境配置: 详细硬件要求与推荐配置(GPU/CPU/内存) 完整的Ubuntu系统设置步骤 Conda环境创建与依赖安装流程 关键组件安装指南(PyTorch、COLMAP等) 常见错误解决方案 项目特点: 支持多种Detector

huanghm88的专栏 120

归并排序(用Java语言内附讲解连接)

归并排序 (Java)   大一下学期学过半本数据结构,但可惜老师并没有讲过次内容,直到快大三的暑假,才抽时间去自学。 以下是自学后用java在IntelliJ IDEA中运行通过的代码,供读者参考 package 二零二零年暑假练习; import java.util.Arrays; import java.util.Scanner; public class Merge_Sort { public static void sort(int[] data,int start,int end){

~晨曦静竹~的博客 1108

【第一章】基于Simulink的控制器开发教程——目录

摘要:本文系统介绍了基于Simulink的控制器开发方法,涵盖PID、状态反馈、模型预测(MPC)、模糊控制、自适应控制等8类主流控制器。针对每种控制器,详细阐述了其基本原理、适用场景,并通过Simulink建模与仿真测试进行实践验证。文章采用"理论+实践"的结构,从算法设计到硬件实现全流程展开,为汽车、航空航天、工业控制等领域的控制器开发提供完整解决方案,最后通过应用对比与学习总结帮助读者掌握不同控制器的核心特性和应用场景。(149字)

熟悉MATLAB/fpga/RK3588/LABVIEW/protus/单片机/dsp/Multisim 385

【SpringBoot 3.x 第51节】带你玩转 GraalVM Native Image:启动快到飞起,内存省到心疼,你还不试试?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1304

图文详解归并排序(java实现)

1.何为归并排序    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 2.图解 3.具体步骤 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指...

碎月浅安 835

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java实现归并排序(图文讲解)

归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之) 思路示意图 动态图 代码实现 package com.sort; import java.util.Arrays; public class MergeSort { public static void mai

临时抱不到佛脚的博客 544

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

三路归并排序(附C++和Java代码)

三路归并排序(附C++和Java代码) 文章目录三路归并排序(附C++和Java代码)C++代码:Java代码: PS:阅读此文章需了解归并排序基本原理和二路归并排序 三路归并,即:将待排序数组等分为三个部分,然后一直分解到能直接求解为止(也就是分解到一个一个元素);最后自底向上逐一归并,直至最终合并为一个数组为止 对于大量数据,虽然三路归并比二路归并排序时间复杂度有所下降,但数量级仍为O(nlo...

serendipity的博客 7586

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java归并排序讲解

归并排序 概念 归并排序是一种基于递归策略的排序算法。它采用分治法,依次将 已经排好序的数组归并成一个数组。递归过程中,直到每一个分组 都只有一个元素,递归就开始回溯。 技术点讲解 上面讲到了两个技术点,分治法和递归,下面进行说明: 分治法 分而治之,把一个复杂的问题分解成很多规模较小的子问题,然后解决这些子问题,把解决的子问题合并起来,大问题就解决了。 递归 将一个规模大的问题转化为规模小的相似的子问题来解决。通俗的来讲就是自己调用自己,在方法中给出递归终止的条件 代码示例 public class Me

qq_44826994的博客 254

Java版八大排序之归并排序(附Java代码及详解)

文章目录希尔排序快速排序 希尔排序 快速排序 归并排序:是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。 归并排序比较占用内存,但却是一种效率高且稳定的算法。 归并排序原理: 把有序表划分成元素个数尽量相等的两半 把两半元素分别排序 把两个有序表合并成一个 归并操作的工作原理如下: 第一步:申请空间,使其大小为两

sinat_41920065的博客 526

Java实现归并排序算法详解及优化

本文将详细讲解如何使用Java实现归并排序算法,并结合图解和实例代码,帮助您全面理解这一高级排序算法。同时,我们探讨了归并排序的优化方法,包括使用插入排序优化小数组,以提高其性能。归并排序是一种分治算法,它将数组分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序数组。初始数组: 38, 27, 43, 3, 9, 82, 10。排序结果: 3, 9, 10, 27, 38, 43, 82。数组: 38, 27, 43, 3, 9, 82, 10。右半部分: 9, 82, 10。

捕风捉你 · 星桥API接入与大模型实战 1263

Java实现归并排序,及其详解

目录归并排序概述实现原理代码实现 归并排序 概述 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 简而言之就是,首先将数组分成两半,再分成两半…直到每部分只剩一个元素,则开始合并,左右两个元素(数组),比较后,形成一个有序的数组,再和其他也合并完的有序数组再次合并,

博客 733

超详解排序算法之(六)归并排序

归并排序 归并排序简介 归并排序是利用归并的思想实现排序的方法,这个排序算法采用了经典的分治策略【所谓分治法,先将问题***分***成一些小的问题然后递归求解,***治***的处理是将分的阶段中得到的各个答案“修补”在一起,从而实现分而治之。 】 看图释义 我们第一步递归的将原始数组分为不可再分的单元 第二步,归并到一起是归并算法的精髓,我们从最小单元开始合并,每一次合并就是一次有序化。通...

清风的博客 238

归并排序算法讲解

归并排序算法是一款十分高效的算法,因为用到了二叉树的特性,我们知道能使用二叉树特性的排序都比较高效,我们详细讲解一下 比如有两个已经排好的数组([5,7],[2,6,10]),这个需要我们进行合并排序,我们改如何排呢 ①首先取出第一个数组第一个元素:5,第二个数组第一个元素:2,我们得到最小值2,放入到第三个数组c中,此时c是[2] ②因为第一个数组第一个元素还没有被拿走,所以第二步我们取出...

美丽的泡沫 1272
上一篇: 1.1.5操作系统(中断和异常,系统调用)
下一篇: 螺旋方阵(列举法,分治法,java版,逆时针)
热爱编程的小白白
热爱编程的小白白 新星计划导师 新星计划导师
博客等级 码龄5年 11万+粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值