经典算法(2)-选择排序

【21天学习挑战】经典算法之【选择排序】 选择排序算法维护一个待排序集合和一个已排序集合,每轮迭代,从待排序集合中选择一个最小(最大)元素,添加到已排序集合中,通过多次迭代,最终完成排序,过程与逻辑比较简单。 阅读详情

算法(2)- 选择排序

概述

选择排序通俗易懂的说法就是在每一轮的排序中找出每个位置对应的数字,比如在第一轮中,找出最小(大)的数字并且放在第一位,第二轮找出第二小(大)的数字放在第二位,以此类推,在第n-1轮里找出倒数第二小(大)的数字放在倒数第二位,剩下的最后一个位置就是最大(小)的数字,选择排序也是比较基础的排序方式,跟冒泡排序其实差不多,都是程序员需要会手写的排序算法

图解

在这里插入图片描述
如上图,该图是第一轮的详细图解。第一次默认min值是左边第一个,即min=5,然后让min值与剩下的值一一比较。即第一次min值与8比较,5小于8,所以min值还是5。第二次,min值与1相比较,5小于1。这时,min值变成1,即min=1,但是5和1的位置不交换。第三次,min值与4比较,4大于1,min值还是1。第四次,min值与3比较,3大于1,min值还是1。此时,第一遍的循环已经结束,然后让现在的min值与第一次的min值的位置相交换。即1与5的位置相交换。
在这里插入图片描述
如上图,该图是完整的选择排序过程,第一轮找出最小的min=1,并且放在第一位,第二轮找出第二小的min=3,放在第二位,第三次,找出第三小的min=4,放在第三位,第四次,找出第四小的min=5,放在第四位,此时只剩下第五位的数字8,自然而然的就是最大的数,且位置的最后一位。

代码

public void sort(int array[]){
        //循环控制轮数,只需要进行到倒数第二轮,到此轮就剩下两个数,此轮结束后数组就已经排序好了
        for(int i=0;i<array.length-1;i++){
            //寻找每轮最小的数
            int min = i;
            //循环控制每轮找最小数字的次数
            for(int j=i+1;j<array.length;j++){
                //如果找到数字比当前的min值小,那么久把min值设置为该数字
                if(array[j]<array[min]){
                    min = j;
                }
            }
            //每轮寻找min值的循环次数结束,此时min值是该轮里最小的,然后再交换min值与第i个数字的位置
            int temp = array[i];
            array[i] = array[min];
            array[min] = temp;
        }
    }

时间复杂度

第一轮需要找(n-1)次,第二轮需要找(n-2)次,以此类推第(n-1)轮需要找1次,则总共需要 ∑ i = 1 n − 1 ( n − 1 ) = 1 + 2 + 3 + . . . + ( n − 1 ) = n 2 2 − n 2 \sum_{i=1}^{n-1} (n-1)=1+2+3+...+(n-1)=\frac{n^2}{2}-\frac{n}{2} ∑i=1n−1​(n−1)=1+2+3+...+(n−1)=2n2​−2n​次,所以选择排序的时间复杂度为:O( n 2 n^2 n2)

一文学懂经典算法系列之:直接选择排序(附讲解视频) 本文关键字:经典算法、排序算法、选择排序、直接选择排序、算法实践。选择排序的核心思想是:每一趟从无序区中选出关键字最小的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止。...... 阅读详情

相关推荐

一文学懂经典算法系列之:冒泡排序

本文关键字:经典算法、排序算法、交换排序、冒泡排序、算法实践。冒泡排序也称气泡排序,是经典的交换排序方法。整个过程就是在无序区中对相邻元素进行两两比较,将不满足相对顺序的一对儿元素进行交换,再进行下一对儿元素的比较。每一趟冒泡后,就会送一个最小的元素达到最上端。在无序区中重复这个过程,直到所有的元素有序。...

微光点亮星辰 9426

排序算法-选择排序-简单选择排序

排序算法-选择排序-简单选择排序 算法思想 假设排序表为L[0...n−1]L[0...n-1]L[0...n−1],第iii趟排序即从L[i−1...n−1]L[i-1...n-1]L[i−1...n−1]中选择最小的元素与L(i−1)L(i-1)L(i−1)进行交换,每一趟排序可以确定一个元素的最终位置,这样经过n−1n-1n−1趟排序就可以使得整个排序表有序。 每一趟在排序元素中选取关键字最小的元素加入有序子序列,每一趟排序可以确定一个元素的最终位置。 n个元素的简单选择排序需要n-1趟处理,因为当

qq_36944952的博客 856

Index-TTS-1.5:多模态语音合成的技术演进与商业落地实践

本文深入探讨了Index-TTS-1.5在多模态语音合成领域的技术演进与商业落地。该模型基于GPT风格的自回归Transformer架构,通过优化条件编码器和引入字符-拼音混合建模,显著提升了语音生成的稳定性、精准度和真实感,实现了高质量的零样本语音克隆。文章还详细介绍了其云端体验、本地WebUI部署及ComfyUI集成等实战路径,并分析了其在虚拟数字人、个性化内容创作等商业场景中的应用潜力与挑战。

weixin_29098367的博客 400

三种简单排序算法

数列排序

qq_61799122的博客 610

Rockchip开发板FUSB302快充调试避坑指南:从设备树配置到驱动修改全流程

本文详细解析了在Rockchip开发板上调试FUSB302快充功能的全流程,重点涵盖设备树配置、驱动修改及硬件设计避坑指南。针对PD协议协商失败、电流倒灌等常见问题,提供了从软件配置到硬件排查的实战解决方案,帮助嵌入式工程师高效完成快充功能开发。

weixin_28256233的博客 114

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1592

输入n个数从小到大排列,选择排序法

m0_56111439的博客 5927

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 345

C语言冒泡排序+选择排序

一,冒泡排序:假如给n个数从小到大排序 思想:总共跑n趟,每一趟都把无序数组中相邻的数(不符合顺序,即前者>后者,a[j]&gt;a[j+1])交换,两两交换,n个数最多交换n-1次。 note:交换可以定义一个temp来交换,也可以直接调用库函数swap。 #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;iostre...

qiaomm的个人博客 1474

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1787

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 364

用选择排序法对键盘输入的n个数字升序排序,要求用函数来实现,n的数值也由键盘输入数据来确定。

#include<stdio.h> void sort(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(a[j]<a[i]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } } int main() { int n; printf("请

m0_56613366的博客 1696

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2326

【经典算法实现 1】选择排序法 O(n^2)

一、大O表示法 大O表示法是一种特殊的表示法,指出了算法的速度有多快,指出了最糟情况下的运行时间。 O(n) 的意思是在最糟糕的情况下,n 为需要运行的次数。 log n^m 的意思是,要几个n 相乘才会得到m。 所以使用二分法,其速度为 O( log 2^m ),其中m 为元素个数总和。 1.1 一些常见的大O 运行时间 O(log n),也叫对数时间,这样的算法包括二分查找。 O(n),也叫线性时间,这样的算法包括简单查找。 O(n * log n) 这样的算法包括快速排序 ——一种速度较快的排序算

|~~~热爱生活、努力学习的小伙汁~~~| 646

CKA-题库-简洁参考答案-反复练习20遍-必过!!!

新版CKA考试已于2020年9月1日正式上线! 考试模式:线上考试 考试时间:2小时 认证有效期:3年 软件版本:Kubernetes v1.19 重考政策:可接受1次重考 经验水平:中級 题目数量:17题 题库量小:随机的题目重复率极高 考试时可打开两个浏览器Tab,一个是考试窗口,一个用来查阅官方文档](https://kubernetes.io/docs/) 01 Task - 英文 Create a new ClusterRole named deployment-clusterrole tha.

随笔记录-分享&记忆 7315

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

头歌实训作业:数据结构十大经典算法(第2关:选择排序)

本关任务:实现选择排序算法,并将乱序数列变成升序。

B5201234的博客 849

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

21天经典算法之直接选择排序

排序算法是通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。最终序列按照一定的规律进行呈现。在排序算法中,稳定性和效率是我们经常要考虑的问题。稳定性:稳定是指当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化。复杂度分析:(1)时间复杂度:即从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。(2)空间复杂度:就是从序列的初始状态经过排序移位变换的过程一直到最终的状态所花费的空间开销。

2401_87555613的博客 688

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

python经典算法大全,python经典算法题

1、什么是算法算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果Python画流程图。mark:我们可以把所有的算法想象为一本“菜谱”,特定的算法比如菜谱中的的一道“老醋花生米”的制作流程,只要按照菜谱的要求制作老醋花生米,那么谁都可以做出一道好吃的老醋花生米。so,这个做菜的步骤就可以理解为:“解决问题的步骤”2、算法的意义。

2301_81900439的博客 868

选择排序与快速排序

基于 “分治法”,选择一个元素作为 “基准(pivot)”,将序列分为两部分:小于基准的元素放左边,大于基准的放右边(相等元素可放任意一侧),然后递归对左右两部分重复排序,直到子序列长度为 1 或 0。:每次从待排序序列中找到最小(或最大)的元素,将其与序列的起始位置(或当前位置)交换,然后在剩余元素中重复这一过程,直到整个序列有序。:优点是平均效率高,实际应用中性能优异(缓存友好,局部性好)。,若基准选第一个 3,右侧的 3 可能被交换到左侧)。(如内存极小)的场景,不适合大规模数据(效率太低)。

2501_93355291的博客 555

十大经典排序算法(2)-选择排序法

选择排序 关键代码 for(int i=1;i<=arr.length;i++){ int min = i; for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[min]){ min = j; } } if(min!=i){ int tmp = arr[min]; arr...

qq_45566354的博客 219

【学习挑战赛】经典算法之直接选择排序

书接上文,今天带来直接选择排序算法的解析过程,从概念到实现一步一个脚印的完成。天气那么热,快来点简单算法解解渴! 这篇文章的最后我也是总结了一般计算时间复杂度的方法,大家可以根据本篇博文去分析时间复杂度或者再以后的做题中思考、锻炼。...............

叶落秋白的博客 1908

经典排序算法系列之二:选择排序

1.序言           这是经典排序算法系列的第二篇,讲的是选择排序的各种排序算法。选择排序主要包括:直接选择排序和堆排序。与上一篇一样,我阐述会这两种排序算法的基本思想,拓展两种算法的思路,分析他们的运行效率。我会由直接选择排序算法过渡慢慢深入到堆排序,让你轻松理解选择排序算法的内涵。   2.直接选择排序   2.1基本思想         第i趟排序开始时,当前有序区和无

shell的专栏 713

决胜经典算法之选择排序

本场Chat是《决胜经典算法》系列的第二场,同样是众多经典算法里较为简单的一个。 本系列将包含如排序、查找、深度优先/广度优先搜索等等经典算法。仅仅排序部分就包含了10种经典的排序算法,适用于不同的场景,后续逐个给大家分享。 通过本场Chat,您将得到如下内容: 冒泡排序法课后习题解答; 选择排序法的原理; 动图演示选择排序的整个流程; 选择排序算法的流程图; 选择排序法的伪...

GitChat 978

【经典算法学习-排序篇】直接选择排序

选择排序的核心思想是:每一趟从无序区中选出关键字最小(或最大)的元素,按顺序放在有序区的最后(生成新的有序区,无序区元素个数减1),直到全部排完为止。换句话说就是:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素全部排完。直接选择排序最基本的选择排序,又称简单选择排序,整个过程就是将无序区中的所有元素逐一比较,找到最小的元素,与无序区中的首个元素进行交换,有序区长度加1,无序区长度减1。重复以上的步骤,知道所有的元素都已经排完为止。........

Wanghs0716的博客 1766

数据结构——排序(2):选择排序+交换排序

在快速排序中,找基准数的函数有多种实现方法,我们下期见~敬请期待“数据结构——排序(3)”~

2301_81888634的博客 1301

经典算法之冒泡排序法与直接选择排序法

冒泡排序与选择排序

人生处处是围城,一切都是最好的安排! 1874
上一篇: 经典算法(1)-冒泡排序
下一篇: 经典算法(3)-插入排序
磕瓜子
博客等级 码龄6年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值