排序算法

【C++】排序算法 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序、快速排序、计数排序、基数排序、桶排序、外排序 阅读详情

在这里插入图片描述
需要手写的:冒泡排序 快速排序
理解内容的:堆排序 归并排序
在这里插入图片描述
一.普通排序

//简单排序
void ChooseSort(int k[], int n)
{
	int i, j, temp;
	for(i = 0; i < n - 1; i++)
	{
		for(j = i + 1; j < n; j++)
		{
			if(k[i] > k[j])
			{
				temp = k[i];
				k[i] = k[j];
				k[j] = temp;
			}
		}
	}
} 

二.冒泡排序
在这里插入图片描述
C
若出现只比较没有移动,则表明后面的数字已经排好的顺序,即可以退出循环,因而可以改进冒泡排序,加一个标志变量flag去判断是否有移位

//冒泡排序(改进后加一个flag) 
void BubbleSort(int k[], int n)
{
	int i, j, temp, flag = 1;
	for(i = 0; i < n - 1 && flag; i++)
	{
		for(j = n - 1; j > i; j--)
		{
			flag = 0;
			if(k[j - 1] > k[j])
			{
				temp = k[j];
				k[j] = k[j - 1];
				k[j - 1] = temp;
				flag = 1;
			}
		}
	}
} 

Java

//冒泡排序
        for(int i = 0 ; i < arr.length - 1; i++){
            for(int j = 0; j < arr.length - 1 - i; j++){
                if(arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

三.选择排序
在这里插入图片描述
先比较,找出min,再交换

//选择排序
void SelectSort(int k[], int n)
{
	int i, j, temp, min;
	for(i = 0; i < n; i++)
	{
		min = i;
		for(j = i + 1; j < n; j++)
		{
			if(k[j] < k[min])
			{
				min = j;
			}
		}
		if(min != i)
		{
			temp = k[i];
			k[i] = k[min];
			k[min] = temp;
		}
	}
}

四.插入排序
基本方法:每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。

分类
可以选择不同的方法在已经排好序的有序数据表中寻找插入位置,依据查找方法的不同,分为常用的三种
①直接插入排序
②折半插入排序
③希尔排序

1.直接插入排序
(在基本有序或者小规模数据的情况下效率很高)
待排序序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
在这里插入图片描述

//直接插入排序
void InsertSort(int k[], int n)
{
	int i, j, temp;
	for(i = 1; i < n; i++)
	{
		if(k[i] < k[i - 1])
		{
			temp = k[i];
			for(j = i - 1; k[j] > temp; j--)
			{
				k[j + 1] = k[j]; //往后移 
			}
			k[j + 1] = temp;
		}
	}
} 

2.折半插入排序
将比较和移动操作分离开来,即先折半查找出元素的待插入位置,然后再同意地移动待插入位置之后的所有元素。

//折半插入排序
void BinaryInsertSort(int k[], int n)
{
	int i, j, temp, low, high, mid;
	for(i = 1; i < n; i++)
	{
		temp = k[i];
		low = 0;
		high = i - 1;
		while(low <= high)
		{
			mid = (low + high) / 2;
			if(k[mid] > temp)
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for(j = i - 1; j >= high + 1; j--)
		{
			k[j + 1] = k[j];
		}
		k[j + 1] = temp;
	}
	
} 

3.希尔排序
思想是使用一个不断缩小的增量gap将数组元素分组,在每个分组内部先进行插入排序,当gap减少到1时整个数组元素分在一组,最后进行一次插入排序,整个排序过程结束。(但是算法不稳定)

do……while控制gap每次的缩小,其内部便是直接插入排序算法的使用,与直接插入排序算法稍有不同的一点是:每次的变化量是gap而不是1。
gap = gap / 3 + 1;

//希尔排序 
void ShellSort(int k[], int n)
{
	int i, j, temp;
	int gap = n;
	do{
		gap = gap / 3 + 1;
		for(i = gap; i < n; i++)
		{
			if(k[i] < k[i - gap])
			{
				temp = k[i];
				for(j = i - gap; k[j] > temp; j -= gap)
				{
					k[j + gap] = k[j];
				}
				k[j + gap] = temp;
			}
		}
	}while(gap > 1);	
} 

五 .堆排序
从小到大构造大顶堆,从大到小构造小顶堆
在这里插入图片描述
将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次最大值。如此反复执行,就能得到一个有序序列了。这个过程其实就是先构建一个最大/最小二叉堆,然后不停的取出最大/最小元素插入到新的队列中,以此达到排序的目的。

例如

int main()
    {
    	int i;
    	int a[10] = {-1, 5, 2, 6, 0, 3, 9, 1, 7, 4}; //从1开始 
    	HeapSort(a, 9);
    	printf("排序后的结果是:");
		for(i = 1; i < 10; i++)
		{
			printf("%2d", a[i]);
		} 
		return 0;
	}

在这里插入图片描述

void HeapSort(int k[], int n)
{
	int i;
	for(i = n / 2; i > 0; i--) //从左到右 从下到上 
	{
		HeapAdjust(k, i, n);
	}
	for(i = n; i > 1; i--)
	{
		swap(k, 1, i); //将第一个元素和最后一个互换 
		HeapAdjust(k, 1, i - 1); //重新调整堆的序列(相当于最大的那个数固定在后面) 
	}
}

2.交换函数

void swap(int k[], int i, int j)
{
	int temp;
	temp = k[i];
	k[i] = k[j];
	k[j] = temp;
} 

3.构造堆
这个循环要确保每个结点都符合大顶堆的特点

void HeapAdjust(int k[], int s, int n)
{
	int i, temp;
	temp = k[s]; //当前需要调整的双亲结点 
	for(i = 2 * s; i <= n; i *= 2) // 2 * i是双亲的左孩子, 2 * i + 1是双亲的右孩子 
	{
		if(k[i] < k[i + 1] && i < n) //i = n就没有i + 1 
		{
			i++; //i指向最大元素孩子的下标 
		}
		if(temp >= k[i])
		{
			break;
		}
		k[s] = k[i]; //大元素放在双亲的位置 
		s = i;
	}
	k[s] = temp;
}

六.归并排序
在这里插入图片描述
在这里插入图片描述
1.递归思想
总的拆成两部分,再拆成两部分,直到不能拆为止

void MergeSort(int k[], int n)
{
	if(n > 1)
	{
		int *list1 = k;
		int list1_size = n / 2;
		int *list2 = k + n / 2;
		int list2_size = n - n / 2;
		
		MergeSort(list1, list1_size);
		MergeSort(list2, list2_size);
		Merging(list1, list1_size, list2, list2_size);
	}
}

归并:把两个部分放在一个临时变量里,最后再覆盖

//实现归并,并把最后的结果存放到list1里 
void Merging(int *list1, int list1_size, int *list2, int list2_size)
{
	int temp[Maxsize];
	int i = 0, j = 0, k = 0, m;
	while(i < list1_size && j < list2_size)
	{
		if(list1[i] < list2[j])
		{
			temp[k++] = list1[i++];
		}
		else
		{
			temp[k++] = list2[j++];
		}
	}
	while(i < list1_size)
	{
		temp[k++] = list1[i++];
	}
	while(j < list2_size)
	{
		temp[k++] = list2[j++];
	}
	for(m = 0; m < list1_size + list2_size; m++)
	{
		list1[m] = temp[m]; 
	}
}

2.迭代思想
递归调用自己,效率不高

// 归并排序(迭代)
void MergeSort(int k[], int n)
{
	int i, left_min, left_max, right_min, right_max, next = 0;
	int *temp = (int *)malloc(n * sizeof(int));
	
	for(i = 1; i < n; i *= 2)
	{
		for(left_min = 0; left_min < n - i; left_min = right_max)
		{
			right_min = left_max = left_min + i;
			right_max = left_max + i;
			
			if(right_max > n)
			{
				right_max = n;
			} 
			while(left_min < left_max && right_min < right_max)
			{
				if(k[left_min] < k[right_min])
				{
					temp[next++] = k[left_min++];
				}
				else
				{
					temp[next++] = k[right_min++];
				}
			}
			while(left_min < left_max)
			{
				k[--right_min] = k[--left_max];
			}
			while(next > 0)
			{
				k[--right_min] = temp[--next];
			}
		}
	} 
}

七.快速排序
基本内容是选择一个数作为准基数,然后利用这个准基数将遗传数据分为两个部分,第一部分比这个准基数小,都放在准基数的左边,第二部分都比这个准基数大,放在准基数的右边.
(用递归的思想)
在这里插入图片描述

快速排序的优化
1.优化选取基准点
确保基准点是处于数据中的中间位置
先找出三个关键字(可以前中后选择一个,进行比较)选择中间的数作为基准点
在这里插入图片描述
2.优化不必要的交换
交换直接改换成赋值即可

//优化后的快速排序
void swap(int k[], int low, int high)
{
	int temp;
	temp = k[low];
	k[low] = k[high];
	k[high] = temp;
}
int Partition(int k[], int low, int high)
{
	int point;
	int mid = low + (high - low) / 2;
	//整个交换就是在确保low是中间值 
	if(k[low] > k[high])
	{
		swap(k, low, high);
	}
	if(k[mid] > k[high])
	{
		swap(k, mid, high);
	} 
	if(k[mid] > k[low])
	{
		swap(k, mid, low);
	}  
	
	point = k[low];  
	while(low < high)
	{
		while(low < high && k[high] >= point)
		{
			high--; //大的部分依然在右边 
		}
		k[low] = k[high];
		while(low < high && k[low] <= point)
		{
			low++; //小的部分依然在左边 
		}
		k[high] = k[low];
	}
	k[low] = point; //最后依然要还原 
	return low; //返回相遇的下标 
}

3.优化小数组的排序方案
就快速排序对于大数据而言,效率很高。但如果是一些小数据就完全没有必要,对于小数组,直接插入排序效率很高。一般分界点是high - low > 7为大数据,则在代码区加上一个判断即可。

4.优化递归操作
在这里插入图片描述

void QSort(int k[], int low, int high) 
{
	int point;
	if(low < high)
	{
		while(low < high)
		{
			point = Partition(k, low, high);
			if(point - low < high - point)
			{
				QSort(k, low, point - 1);
				low = point + 1;
			} 
			else
			{
				QSort(k, point + 1, high);
				high = point - 1;
			}
		}
	}
}

八.总结
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

排序算法:稳定的排序算法 元素,并围绕主元对列表进行分区,将较小的元素放入低数组中,将所有较大的元素放入高数组中。然后,我们对他们的第十位的值进行排序。因此,我们可以对任意大小的列表进行排序,而无需在冒泡排序中使用任何额外的空间。我们可以说,子问题可以被视为对数组的一部分进行排序,从任何索引 s(start) 开始,到任何索引 e(end) 结束。正如我们上面所讨论的,最大堆是一个完全二叉树,其中每个内部节点中的值都大于或等于该节点的子节点中的值。此外,每次迭代后,已排序子数组的大小都会增加,而未排序子数组的大小会减少。 阅读详情

相关推荐

八种排序算法

偶尔有看到排序算法,想起来大学里老师也有讲授过冒泡排序、快速排序等,不过现在已经没什么概念,一查发现排序算法有八种,有的甚至连名字都没听过,感概平时看的少。既然已经看到了,就干脆了解下基础概念,避免在后续学习途中,出现一看就懵逼的情况。   冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到...

dobat的博客 3348

MySql trigger 触发器

这篇是整合网上其他的文章的,原文链接: http://blog.fity.cn/post/352/ http://www.cnblogs.com/duodushu/p/5446384.html 开始: MySQL触发程序 TRIGGER触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。Mysql5之后开始支持触发器,并且在创建触发器后会自动在/var/lib

李海锋的博客 1336

排序算法总结及C++实现

文章目录1 引入 认识时间复杂度2 补充 对数器3 排序算法分析3.1 基于比较的排序3.1.1 冒泡排序3.1.2 选择排序3.1.3 插入排序3.1.4 归并排序补充题目 小和问题补充题目 逆序数3.1.5 快速排序3.1.6 堆排序3.2 非基于比较的排序3.2.1 计数排序3.2.2 桶排序3.2.3 基数排序4 排序总结4.1 稳定性4.2 工程中的综合排序算法4.3 有关排序...

李滚滚的博客 2223

推荐系统二---召回算法和业界最佳实践(一)

业界通用推荐系统框架结构如下: Match &amp;amp;amp;amp; Rank 定义:Match基于当前user(profile、history)和context,快速在全库里找到TopN最相关的item,给Rank来做小范围综合多目标最大化 通常做法:用各种算法做召回,比如user/item/model-based CF,Content-based,Demographic-based,DNN-Embeddi...

瑶子的博客 1万+

排序算法 - 面试中的排序算法总结

排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。 一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对

从零开始 2982

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 683

常见数据排序算法

常见的数据排序算法可以大致分为两类: 1.比较类排序 2.非比较类排序  比较类排序算法主要是通过数据间的比较实现,其时间复杂度是无法突破O(nlogn)的  非比较类排序算法不是通过数据间的排序实现,其时间复杂度可以以线性完成,时间和速度会比非比较类排序算法更优 ...

a1351937368的博客 1574

倍压整流电路设计

倍压整流电路利用二极管和电容的充放电特性实现电压提升,可分为二倍压、三倍压及多倍压结构。其工作原理是通过交流电正负半周交替对电容充电并叠加电压,具有结构简单、成本低的优点,但带载能力差且纹波较大。典型应用包括示波器、电蚊拍等小电流高压场景。设计时需重点考虑电容耐压、二极管选型和负载匹配,高频驱动可优化性能。该电路在低功耗高压电源中具有独特优势,但需注意安全防护与电压稳定性问题。

硬核科技 1716

九大排序算法再总结

如果要转载,需要注明出处: http://blog.youkuaiyun.com/xiazdong 本文是 http://blog.youkuaiyun.com/xiazdong/article/details/7304239 的补充,当年看了《大话数据结构》总结的,但是现在看了《算法导论》,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍。 本文首先介绍了基于比较模型的排序算法,

xiazdong 31万+

Halcon: 获取仿射矩形-rectangle2的四个顶点、四条边的中点

Halcon 工业应用实用教程中的一个例子: * CenterY : 仿射矩形中心y * CenterX: 仿射矩形中心x * Phi: 仿射矩形角度 * Len1: 仿射矩形宽的一半 * Len2: 仿射矩形高的一半 * CornerY: 仿射矩形端点y * CornerX: 仿射矩形端点x * LineCenterY: 仿射矩形边中点y * LineCenterx: 仿射矩形边中点x * 矩...

ruotianxia的博客 8574

Spring Boot入门(13):Mybatis-Plus之条件构造器使用手册:精通让你快速提高查询效率的技巧!

化繁为简,MP 中条件构造器的使用,极其详细.

**My Coding Family** 3万+

「排序算法」十大经典排序算法

文章目录十大经典排序算法一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 引用网站:菜鸟教程十大经典排序 十大经典排序算法 排序算法图片总结(图片来源于网络) 一、冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢

秋天,黄叶坠地,凉风有信。 6436

RK3568笔记六十一:MIPI摄像头应用程序编写

V4L2设备驱动框架向应用层提供了一套统一、标准的接口规范,应用程序按照该接口规范来进行应用编程,从而使用摄像头。对于摄像头设备来说,其编程模式如下所示:1.首先是打开摄像头设备;2.查询设备的属性或功能;3.设置设备的参数,譬如像素格式、帧大小、帧率;4.申请帧缓冲、内存映射;5.帧缓冲入队;6.开启视频采集;7.帧缓冲出队、对采集的数据进行处理;8.处理完后,再次将帧缓冲入队,往复;9.结束采集。

1004

【排序算法】排序算法总结

排序算法总结,将排序算法的分类、稳定性和特点进行一个总结,并附有跳转到对应详解的链接,方便大家学习

weixin_52811588的博客 987

AUTOSAR进阶图解==>AUTOSAR_SWS_ECUStateManager

AUTOSAR ECU State Manager 摘要 AUTOSAR ECU状态管理器(EcuM)是Classic Platform 4.4.0规范中的核心模块,负责管理ECU的整个生命周期,包括启动、运行、关机和睡眠等状态转换。EcuM通过协调各基础软件模块的初始化过程,确保系统可靠运行。 主要功能包括: 启动管理 - 控制从硬件初始化到应用运行的完整启动序列 状态转换 - 管理RUN/POST_RUN/SHUTDOWN等状态切换 唤醒验证 - 区分真实与虚假唤醒事件 关机序列 - 确保安全关机保存关

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2476

【WRF-Chem工具】anthro_emiss 详解:生成人为排放数据

anthro_emiss 详解:生成人为排放数据

WW、forever的博客 2056

稳定排序算法有哪些

稳定排序算法有哪些 相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 “稳定” 的,有些是 “不稳定” 的。 给定的待排序序列中,经常会包含相同的元素,例如: 3 1 2 4 2 此序列中包含两个元素 2,为了区分它们,我们分别称它们为 “红 2” 和 “绿 2”。 评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序列中红 2 和绿 2 的相对位置是:红 2 位于绿 2 的左侧,或者说绿 2 位于红 2

ccc369639963的博客 1万+

华为OD机试 - 敌情监控 - 滑动窗口(Java 双机位C卷 200分)

说明 第一行第一个正整数5,表示敌人有5个营地,第二个正整数2,表示连续营地 的数量是2, 第3个正整数3, 表示后续会有3条查询的命令;接下来一行有 5个正整数,分别表示每个营地里开始的人的数,第1个营地开始有1个人,第 2个营地开始有2个人,第3个营地开始有2个人,第4个营地开始有3个人,第 5 个营地开始有3个人;第3条命令:Query 2 4 表示查询第2到第4个营地的总人数,结果:2+8=10 第一个输出是: 10,注意这里第3个营地人数在第2条命令中增加了6。第一行3个正整数:N K L。

学Java,找哪吒 765

十大经典排序算法

十种常见的排序算法可分为以下两大类: 比较类排序:通过比较来决定元素间的相对位置,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对位置,它可以突破基于比较排序的时间下限,以线性时间运行,因此也称为线性时间非比较类排序。 时间复杂度: 从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。

qq_40896594的博客 3672

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

排序算法总结

1.排序算法分类 基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。 根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。 2.排序算法的综合分析 各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下: 事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据

黄俊彬 2542

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

什么是排序算法?常见的排序算法有哪些?

计数排序适用于数据范围较小且已知的情况,其时间复杂度为线性时间,非常适合处理小范围内的数据排序。基数排序适用于整数排序,特别是当数据范围较大但数据量适中时。它通过多次应用计数排序来实现多轮排序,从而克服了传统排序算法在处理大范围数据时的效率问题。

破损的天堂鸟博客 1227

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

十大排序算法

算法稳定性:单次比较后,两个值相等的邻近元素的位置在排序后,相对位置没有改变。

一名想做出点成就的后端~ 1429

排序算法详解

排序算法是计算机科学中最基础也最重要的算法之一。它将一组数据(例如数字列表、字符串集合)按照特定的顺序(升序或降序)重新排列。高效的排序算法对于优化其他算法(如搜索和合并算法)的效率至关重要。

m0_54069809的博客 1170

常见排序算法详解

排序是我们在日常生活和工作中常见的一种操作。在计算机科学中,排序算法就是将一串或一组数据按照特定的顺序进行排列的算法。这些顺序可能是数字的升序或降序,也可能是字母或字词的字母顺序等。我们将探讨几种不同的排序算法,包括他们的原理、优缺点以及代码实现。常见的排序算法包括:冒泡排序、快速排序、插入排序、选择排序、希尔排序、归并排序、堆排序、基数排序等。这些排序算法中,有些是比较排序,即通过比较元素之间的关系进行排序;

沐雨风栉 875

排序算法-10种排序算法

文章目录一、排序算法是什么?1.解释2.内部排序3.外部排序二、排序算法介绍及实现1.冒泡排序算法描述四、测试 一、排序算法是什么? 1.解释 这里引入百度百科的解释: 谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。 在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。 2.内

GGB__的博客 933
上一篇: 二叉树的建立和四种遍历算法
下一篇: 汉诺塔问题(递归)
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值