排序技术_各种算法原理 图解 代码实现


本文转至 starive_giant 大神的《排序技术_各种算法原理 图解 代码实现》,地址:http://blog.csdn.net/ggxxkkll/article/details/8667429


排序技术有很多种,下面简单介绍一下几种。


一  插入排序


1.1  直接插入排序

基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。

图解:


代码实现:
[cpp]  view plain copy
  1. //直接顺序排序  
  2. void InsertSort(int r[], int n)  
  3. {     
  4.     for (int i=2; i<n; i++)  
  5.     {   
  6.       r[0]=r[i];                        //设置哨兵  
  7.       for (int j=i-1; r[0]<r[j]; j--)   //寻找插入位置  
  8.             r[j+1]=r[j];                //记录后移  
  9.       r[j+1]=r[0];                   
  10.     }  
  11.     for(int k=1;k<n;k++)  
  12.        cout<<r[k]<<" ";     
  13.     cout<<"\n";  
  14. }  


1.2 希尔排序

基本思想是: 先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。

图解:

代码实现:
[cpp]  view plain copy
  1. <span style="font-size:14px;">//希尔排序  
  2. void ShellSort(int r[], int n)  
  3. {     
  4.     int i;  
  5.     int d;  
  6.     int j;  
  7.     for (d=n/2; d>=1; d=d/2)            //以增量为d进行直接插入排序  
  8.     {  
  9.          for (i=d+1; i<n; i++)     
  10.          {     
  11.              r[0]=r[i];                 //暂存被插入记录  
  12.                for (j=i-d; j>0 && r[0]<r[j]; j=j-d)  
  13.                      r[j+d]=r[j];       //记录后移d个位置  
  14.                           r[j+d]=r[0];  
  15.          }  
  16.     }  
  17.    for(i=1;i<n;i++)  
  18.        cout<<r[i]<<" ";  
  19.    cout<<"\n";  
  20. }</span>  



二 交换排序

2.1 起泡排序

起泡排序是交换排序中最简单的排序方法,其基本思想是: 两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。

图解:



代码实现:
[cpp]  view plain copy
  1. <span style="font-size:14px;">//起泡排序  
  2. void BubbleSort(int r[], int n)  
  3. {  
  4.     int temp;  
  5.     int exchange;  
  6.     int bound;  
  7.     exchange=n-1;                       //第一趟起泡排序的范围是r[0]到r[n-1]      
  8.     while (exchange)                    //仅当上一趟排序有记录交换才进行本趟排序  
  9.     {  
  10.         bound=exchange;   
  11.         exchange=0;    
  12.         for (int j=0; j<bound; j++)     //一趟起泡排序  
  13.         if (r[j]>r[j+1])   
  14.         {  
  15.           temp=r[j];  
  16.           r[j]=r[j+1];  
  17.           r[j+1]=temp;  
  18.           exchange=j;                   //记录每一次发生记录交换的位置  
  19.        }  
  20.     }  
  21.     for(int i=0;i<n;i++)  
  22.        cout<<r[i]<<" ";  
  23.     cout<<"\n";  
  24. }</span>  


2.2快速排序

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

图解:


代码实现:
[cpp]  view plain copy
  1. //快速排序一次划分  
  2. int Partition(int r[], int first, int end)  
  3. {     
  4.     int i=first;                        //初始化  
  5.     int j=end;  
  6.     int temp;          
  7.   
  8.     while (i<j)    
  9.     {    
  10.        while (i<j && r[i]<= r[j])  
  11.             j--;                        //右侧扫描  
  12.        if (i<j)  
  13.        {   
  14.              temp=r[i];                 //将较小记录交换到前面  
  15.              r[i]=r[j];  
  16.              r[j]=temp;  
  17.               i++;   
  18.        }  
  19.        while (i<j && r[i]<= r[j])   
  20.            i++;                         //左侧扫描  
  21.            if (i<j)  
  22.            {  
  23.               temp=r[j];  
  24.               r[j]=r[i];  
  25.               r[i]=temp;                //将较大记录交换到后面  
  26.                j--;   
  27.            }  
  28.     }  
  29.     return i;                           //i为轴值记录的最终位置  
  30. }  
  31.   
  32. //快速排序  
  33. void QuickSort(int r[], int first, int end)  
  34. {  
  35.     if (first<end)   
  36.     {                                   //递归结束  
  37.            int pivot=Partition(r, first, end);  //一次划分  
  38.            QuickSort(r, first, pivot-1);//递归地对左侧子序列进行快速排序  
  39.            QuickSort(r, pivot+1, end);  //递归地对右侧子序列进行快速排序  
  40.     }  
  41.   
  42. }  


三 选择排序

3.1 简单选择排序

基本思想:设所排序序列的记录个数为n。i取1,2,…,n-1,从所有n-i+1个记录(Ri,Ri+1,…,Rn)中找出排序码最小的记录,与第i个记录交换。执行n-1趟 后就完成了记录序列的排序。

图解:

代码实现:
[cpp]  view plain copy
  1. //简单选择排序  
  2. void SelectSort(int r[ ], int n)  
  3. {   
  4.     int i;  
  5.     int j;  
  6.     int index;  
  7.     int temp;  
  8.     for (i=0; i<n-1; i++)                //对n个记录进行n-1趟简单选择排序  
  9.     {    
  10.        index=i;           
  11.        for (j=i+1; j<n; j++)            //在无序区中选取最小记录  
  12.          if (r[j]<r[index])  
  13.              index=j;  
  14.        if (index!=i)   
  15.        {  
  16.           temp=r[i];  
  17.           r[i]=r[index];  
  18.           r[index]=temp;  
  19.        }  
  20.     }  
  21.     for(i=0;i<n;i++)  
  22.         cout<<r[i]<<" ";  
  23.     cout<<"\n";  
  24. }  


3.2 堆排序

堆的定义

    是具有下列性质的完全二叉树:每个结点的值都小于或等于其左右孩子结点的值(小根堆);或者每个结点的值都大于或等于其左右孩子结点的值(大根堆)。

大根堆和小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。注意:①堆中任一子树亦是堆。②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。


假设当前要筛选结点的编号为k,堆中最后一个结点的编号为m,并且结点k的左右子树均是堆(即r[k+1] ~ r[m]满足堆的条件),则筛选算法用伪代码可描述为:


具体的筛选代码如下:

[cpp]  view plain copy
  1. //筛选法调整堆  
  2. void Sift(int r[], int k, int m)  
  3. {  
  4.     
  5.     int i;  
  6.     int j;  
  7.     int temp;  
  8.     i=k;   
  9.     j=2*i+1;                            //置i为要筛的结点,j为i的左孩子  
  10.   while (j<=m)                          //筛选还没有进行到叶子  
  11.   {  
  12.       if (j<m && r[j]<r[j+1])   
  13.           j++;                          //比较i的左右孩子,j为较大者  
  14.       if (r[i]>r[j]) break;             //根结点已经大于左右孩子中的较大者  
  15.       else   
  16.       {  
  17.            temp=r[i];  
  18.            r[i]=r[j];  
  19.            r[j]=temp;                   //将根结点与结点j交换  
  20.            i=j;  
  21.            j=2*i+1;                     //被筛结点位于原来结点j的位置  
  22.      }  
  23.   }  
  24. }  


堆排序

堆排序的基本思想是:首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者即堆顶记录,然后将它从堆中移走(通常将堆顶记录和堆中最后一个记录交换),并将剩余的记录再调整成堆,这样又找出了次大的记录,以此类推,直到堆中只有一个记录为止。


(1)用大根堆排序的基本思想
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……

直到无序区只有一个元素为止。

(2)大根堆排序算法的基本操作:

① 初始化操作:将R[1..n]构造为初始堆;

② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

注意:

①只需做n-1趟排序,选出较大的n-1个 关键字即可以使得文件递增有序。

②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接 选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止







代码实现:
[cpp]  view plain copy
  1. //堆排序  
  2. void HeapSort(int r[ ], int n)  
  3. {  
  4.      
  5.   int i;  
  6.   int temp;  
  7.   for (i=n/2; i>=0; i--)                //初始建堆,从最后一个非终端结点至根结点  
  8.      Sift(r, i, n) ;       
  9.    for (i=n-1; i>0; i--)                //重复执行移走堆顶及重建堆的操作  
  10.    {  
  11.        temp=r[i];  
  12.        r[i]=r[0];  
  13.        r[0]=temp;  
  14.       Sift(r, 0, i-1);  
  15.    }  
  16.    for(i=0;i<n;i++)  
  17.       cout<<r[i]<<" ";  
  18.    cout<<"\n";  
  19. }  


四 归并排序

二路归并排序
基本思想:将若干个有序序列进行两两归并,直至所有待排序记录都在一个有序序列为止。



一路归并算法实现:
[cpp]  view plain copy
  1. //一次归并  
  2. void Merge(int r[], int r1[], int s, int m, int t)  
  3. {  
  4.   
  5.     int i=s;  
  6.     int j=m+1;  
  7.     int k=s;  
  8.         
  9.      while (i<=m && j<=t)  
  10.      {     
  11.          if (r[i]<=r[j])   
  12.              r1[k++]=r[i++];            //取r[i]和r[j]中较小者放入r1[k]  
  13.          else   
  14.              r1[k++]=r[j++];   
  15.      }  
  16.       if (i<=m)   
  17.           while (i<=m)                  //若第一个子序列没处理完,则进行收尾处理           
  18.               r1[k++]=r[i++];   
  19.       else    
  20.           while (j<=t)                  //若第二个子序列没处理完,则进行收尾处理          
  21.             r1[k++]=r[j++];   
  22. }  



[cpp]  view plain copy
  1. //一趟归并  
  2. void MergePass(int r[ ], int r1[ ], int n, int h)  
  3. {  
  4.     int i=0;  
  5.     int k;  
  6.   
  7.    while (i<=n-2*h)                     //待归并记录至少有两个长度为h的子序列  
  8.    {  
  9.      Merge(r, r1, i, i+h-1, i+2*h-1);  
  10.         i+=2*h;  
  11.    }  
  12.    if (i<n-h)   
  13.        Merge(r, r1, i, i+h-1, n);       //待归并序列中有一个长度小于h  
  14.    else for (k=i; k<=n; k++)            //待归并序列中只剩一个子序列  
  15.         r1[k]=r[k];  
  16. }  
  17.   
  18. //归并排序的非递归算法  
  19. void MergeSort1(int r[ ], int r1[ ], int n )  
  20. {   
  21.   int h=1;  
  22.   int i;  
  23.   
  24.   while (h<n)  
  25.   {  
  26.     MergePass(r, r1, n-1, h);           //归并  
  27.     h=2*h;  
  28.     MergePass(r1, r, n-1, h);  
  29.     h=2*h;  
  30.   }  
  31.   for(i=0;i<n;i++)  
  32.       cout<<r[i]<<" ";  
  33.   cout<<"\n";  
  34. }  


下面看看二路归并排序的递归实现


[cpp]  view plain copy
  1. //归并排序的递归算法  
  2. void MergeSort2(int r[], int r1[], int r2[],int s, int t)  
  3. {   
  4.    
  5.     int m;  
  6.     if (s==t)   
  7.     {  
  8.         r1[s]=r[s];  
  9.   
  10.     }  
  11.     else   
  12.     {   
  13.             m=(s+t)/2;  
  14.             MergeSort2(r, r2, r1, s, m);        //归并排序前半个子序列          
  15.             MergeSort2(r, r2, r1, m+1, t);      //归并排序后半个子序列  
  16.             Merge(r2, r1, s, m, t);             //将两个已排序的子序列归并        
  17.     }      
  18. }  



总结

各种排序方法的比较(未完待续):


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iphone5s拆机方法图解-多图 独家:iphone5s拆机方法图解--共37图 Step 1 — iPhone 5s Teardown • [size=1em]An iPhone release means a trip to the future—the iFixit teardown crew has traveled 17 hours forward in time to get the iPhone 5s early. • [size=1em]We want to send out a big thanks to our good friends at MacFixit Australia for letting us use their office in Melbourne for the teardown. They stock Mac and iPhone upgrades/accessories, and also carry ouriFixit toolkits. o [size=1em]To cover all our bases, we confirmed with our best linguists that the 5s upside-down is still the 5s. • [size=1em]Speaking of toolkits, for this teardown, we'll be using iFixit's brand-new Pro Tech Screwdriver Set. Step 2 • [size=1em]As we ready ourselves to delve into the delightful innards of the 5s, let's check out some of its tech specs: o [size=1em]Apple A7 processor with 64-bit architecture o [size=1em]M7 motion co-processor o [size=1em]16, 32, or 64 GB Storage o [size=1em]4-inch retina display with 326 ppi o [size=1em]8 MP iSight camera (with larger 1.5μ pixels) and a 1.2MP FaceTime camera. o [size=1em]Fingerprint identity sensor built into the home button o [size=1em]Available in three different colors: space gray, silver, and gooooooold (or as we call them, Not-at-all-the-Color-of-Space, Second Place Medal, and Bling!). Step 3 • [size=1em]Apple continues the everlasting trend of locking users out with pentalobular screws. Luckily, we came prepared. We whip out our trusty iPhone 5 Liberation Kit, and to our pleasant surprise, it works! • [size=1em]Unfortunately, we are ill-equipped in the color department, as we only have silver and black replacement Phillips screws. o [size=1em]We are currently involved in heavy lobbying to our product designers to create 14k gold replacement screws. They'll be $50 each and strip the first time you try to unscrew them, so they will be perfect for the iPhone. Stay posted. • [size=1em]With our iPhone 5s sufficiently liberated, it reminds us of another polka-dotted iPhone teardown coming in the near future… Step 4 • [size=1em]We're done screwing around; it's time to get this baby open! Just like last year, we enlist the help of a suction cup to free the display assembly from the rear casing. • [size=1em]Unlike last year, we make use of some gentle spudgering, just in case… Step 5 • [size=1em]Our careful spudgering paid off. At the bottom of the phone, a cable connects the Touch ID sensor in the home button to the Lightning port assembly. o [size=1em]This adds a small element of danger to disassembly, as pulling too hard on the suction cup could cause accidental damage to the cable. • [size=1em]We survive this first booby trap and swiftly disconnect the Touch ID cable connector with the help of a spudger. • [size=1em]Alas, our first peek at the internal layout of the 5s. Comparing it to the iPhone 5, we spot very few differences, the main one being the lack of a battery removal pull-tab. Step 6 • [size=1em]With our favorite screwdriver set, we remove a few metal connector covers and embark on the epic battle of battery removal. • [size=1em]The missing battery pull-tab, though seemingly innocuous, indicates a bigger problem for battery repair: glue. • [size=1em]Perhaps the "s" in 5s stands for "stuck," as in "this battery is stuck in with a lot of glue," or "I hope you didn't want to replace your battery—you're going to be stuck with this one." • [size=1em]While we'd love a tool-less battery removal as we've seen in other phones, we settle for thermal battery removal via an iOpener. • [size=1em]Holy adhesive! It appears Apple ditched the minimal adhesive in the iPhone 5 in favor of those two huge white runways of adhesive holding the 5s(tuck) battery in place. Step 7 • [size=1em]The 5s has a claimed 10 hours of talk time on 3G, but there are rumbles that iOS 7 isn't doing you any favors. • [size=1em]The gold unit from Desay Battery Co., Ltd in Huizhou, China sports a 3.8V - 5.92Wh - 1560mAh battery. Comparatively: o [size=1em]iPhone 5: 3.8 V - 1440 mAh - 5.45 Wh. Talk time: Up to 8 hours on 3G. Standby time: Up to 225 hours. o [size=1em]Samsung Galaxy S4: 3.8 V - 2600 mAh - 9.88 Wh. Talk time: up to 7 hours. Standby time: Up to 300 hours. o [size=1em]Motorola Moto X: 3.8 V - 2200 mAh - 8.4 Wh. 24 hours of "mixed usage." • [size=1em]It appears different units sport different battery manufacturers; our "space-gray" spare (right) comes to us from Simplo Technology Inc. Step 8 • [size=1em]With the battery safely removed, we turn to the next step in our disassembly journey: removing the(unchanged) 326 ppi Retina display assembly. • [size=1em]A few flicks of a spudger to disconnect the FaceTime camera, digitizer, and LCD cables, and the display is free. o [size=1em]Looking for some tech specs on the display? Well look no further! In fact, just look backwards…to the iPhone 5. Despite the trend in almost every other smartphone release, the iPhone 5s display is no bigger, better, or badder than the 5. Step 9 • [size=1em]We quickly extract the home button and Touch ID, Apple's new fingerprint scanner. Time to dust for prints! o [size=1em]A CMOS chip, the Touch ID is essentially a bunch of very small capacitors that creates an "image" of the ridges on your finger. • [size=1em]The sensor technology, developed by AuthenTecand bought by Apple a year ago, reportedly stores your fingerprints locally, so giving your iPhone the finger will not make it all the way back to Cupertino. • [size=1em]We worry about how well the sapphire crystal covering the sensor can protect it from degrading over time like most CMOS fingerprint sensors. If not, it could become a ticking time bomb, just like that super-glued battery. Step 10 • [size=1em]We uncover the iSight camera. • [size=1em]The back of the iSight camera is labeled DNL333 41WGRF 4W61W. • [size=1em]According to our good friend Jim Morrison, Vice President of the Technology Analysis Group atChipworks, "the DNL markings are consistent with the markings on the camera modules housing the Sony IMX145 we saw in the iPhone 4s and on the iPhone 5. The marks on the side of the module are different, but our industry insiders tell us this is Sony's again" • [size=1em]As Apple has stated the pixel pitch on this camera is 1.5 μ, this sensor should not be the IMX145, but a newer variant. • [size=1em]The bottom of the camera is labeled AW32 65BD 4511 b763. Step 11 • [size=1em]For those of us counting steps and comparing with last year, we're unsurprisingly right on par. • [size=1em]A great example of Apple's iterative design, the 5s shows some streamlining and optimization in its internal construction. • [size=1em]Gone are those silly antenna interconnect cables, leaving one less thing to break or get accidentally disconnected. o [size=1em]If only they had decided to move that antenna connector from the bottom of the logic board to the top... Step 12 • [size=1em]Looks like we found a Murata 339S0205 Wi-Fi module (based on the Broadcom BCM4334, according to Chipworks). • [size=1em]Again comparing our 16 and 64 GB models: o [size=1em]It seems that the Murata IC is the same between both iPhone 5s'. o [size=1em]The design of both logic boards may be identical, but slight differences in markings (e.g. 94V-0 on the rightmost, nonexistent on the leftmost) may indicate that Apple is manufacturing the 5s logic boards at multiple locations. Step 13 ¶ • [size=1em]Open ses-EMI! Behold, IC treasures identified: o [size=1em]SK Hynix H2JTDG8UD3MBR 128 Gb (16 GB) NAND Flash o [size=1em]Qualcomm PM8018 RF power management IC o [size=1em]TriQuint TQM6M6224 o [size=1em]Apple 338S1216 o [size=1em]Broadcom BCM5976 touchscreen controller o [size=1em]Texas Instruments 37C64G1 o [size=1em]Skyworks 77810 Step 14 • [size=1em]More ICs! o [size=1em]Skyworks 77355 o [size=1em]Avago A790720 o [size=1em]Avago A7900 o [size=1em]Apple 338S120L • [size=1em]A super-awesome thanks to the Chipworks team for helping us decode and discern these delightful devices! Step 15 • [size=1em]Turning our attention to the backside of the logic board: o [size=1em]Apple A7 APL0698 SoC (based on thisMacRumors post, the markings F8164A1PD indicate the RAM is likely 1GB) o [size=1em]Qualcomm MDM9615M LTE Modem o [size=1em]Qualcomm WTR1605LLTE/HSPA+/CDMA2K/TDSCDMA/EDGE/GPS transceiver. • [size=1em]As we search for a much-anticipated M7 coprocessor, we begin to wonder if it actually is a separate IC, or if it is additional functionality built into the A7. o [size=1em]Maybe the "M" stands for "magical," the M7 is invisible, and Apple does use pixie dust to hold the device together. Or perhaps the "M" stands for "marketing"… o [size=1em]Update: the M7 has been found! • [size=1em]Our A7 was fabbed in July. Step 16 • [size=1em]It's time to investigate the new kid on the block, and it's fly like an A7. Along with the fingerprint sensor, the A7 is a major enticement for consumers to pick the 5s over the 5c. • [size=1em]The A7 is advertised as providing twice the performance of the 5 (and 5c)'s A6 processor. o [size=1em]The switch to the A7 marks the first use of a 64-bit processor in a smartphone. Based on AnandTech's review, it seems that the bulk of the A7's performance gains do not come from any advantages inherent to a 64-bit architecture, but rather from the switch from the outdated ARMv7 instruction set to the newly-designed ARMv8. o [size=1em]The modern ARMv8 instruction set was designed for a 64-bit architecture. It does away with the legacy support of the last 20 years, which increases efficiency, improving performance without sacrificing battery life. • [size=1em]We'll have to wait until we get inside the chip to find out who manufactured it. Step 17 • [size=1em]Time for your close-up, selfie cam! • [size=1em]A few screws hold the 1.2MP FaceTime camera in place. • [size=1em]While the updated pixel size in the iSight camera may get a lot of attention, DIY paparazzi is what bling iPhones are all about. Step 18 • [size=1em]The lower peripherals on the 5s look very similar to those in the 5, though the speaker assembly comes out with slightly more ease in this iteration. • [size=1em]With the speaker assembly out, the headphone jack/microphone/Lightning connector assembly comes out easily. o [size=1em]As with previous generations, you will have to replace multiple components at once, since the design is not modular. Step 19 • [size=1em]We find another hardware update: the new dual flash. • [size=1em]White and amber LEDs sit by the camera to balance the flash-induced ghostly tones of night-life photography. Step 20 • [size=1em]iPhone 5s Repairability: 6 out of 10 (10 is easiest to repair) • [size=1em]Just like in the iPhone 5, the display assembly is the first component out of the phone, simplifying screen replacements. • [size=1em]The battery is still fairly easy to access, even though it's not technically "user replaceable." • [size=1em]The battery has lost the 5's convenient pull tab, and gained more resilient adhesive—it now requires heat and prying to remove. • [size=1em]The fingerprint sensor cable could be easily ripped out of its socket if a user is not careful while opening the phone. • [size=1em]The iPhone 5s still uses Pentalobe screws on the exterior, making the 5s difficult to open. • [size=1em]The front glass, digitizer, and LCD are all one component, thereby increasing cost of repair.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值