vbs各种排序,字符串从小到大(升序)排序

本文详细介绍了VBS中的各种排序算法,包括快速排序、直接插入排序、希尔排序、冒泡排序、直接选择排序和堆排序。通过实例代码演示了如何在VBS环境中实现这些算法,并对每种算法进行了性能分析。

***vbs各种排序********

option explicit
'接收输入:
dim s,r,n,i
s=inputbox(vbcrlf&vbcrlf&"以空格隔开:","请输入一组数:","2007 10 18 21 15")
if s="" then wscript.quit
r=split(s," ")
n=ubound(r)
        '把字符串转换为Double 子类型:
for i=0 to n
        r(i)=cdbl(r(i))
next

'快速排序方法调用:
quicksort r,0,n
'其它排序方法的调用:
'insertsort r
'shellsort r
'bubblesort r
'selectsort r
'heapsort r

'输出结果:
inputbox vbcrlf&vbcrlf&"按升序排列是:","结果",join(r," ")








'各种排序子过程自定义:
'直接插入排序:
sub insertsort(r)
        dim i,n,t,j
        n=ubound(r)
        for i=1 to n'依次插入r(1),r(2),...,r(n)
                t=r(i)
                j=i-1
                do while t<r(j)'查找r(i)的插入位置
                        r(j+1)=r(j)'将大于r(i)的数后移
                        j=j-1
                        if j=-1 then exit do
                loop
                r(j+1)=t'插入r(i)
        next
end sub

'希尔排序:
sub shellsort(r)
                '设置增量序列:
        dim i,d(),n,t,k,h,j
        n=ubound(r)
        i=0
        redim d(n)
        d(i)=fix(n/2)
        do until d(i)=1
                t=d(i)
                i=i+1
                d(i)=fix(t/2)
        loop
                '排序:
        k=0
        do
                h=d(k)'取本趟增量
                for i=h to n'r(h)到r(n)插入当前有序区
                        t=r(i)'保存待插入数
                        j=i-h
                        do while t<r(j)'查找正确的插入位置
                                r(j+h)=r(j)'后移
                                j=j-h'得到前一数的位置
                                if j<0 then exit do
                        loop
                        r(j+h)=t'插入r(i)
                next'本趟排序完成
                k=k+1
        loop while h<>1
end sub

'冒泡排序:
sub bubblesort(r)
        dim i,n,noswap,j,t
        n=ubound(r)
        for i=0 to n-1'做n趟排序
                noswap=True'置未交换标志
                for j=n-1 to i step -1'从下往上扫描
                        if r(j+1)<r(j) then'交换
                                t=r(j)
                                r(j)=r(j+1)
                                r(j+1)=t
                                noswap=False
                        end if
                next
                if noswap then exit for'本趟排序中未发生交换则终止算法
        next
end sub

'快速排序:
        '划分:
function partition(r,l,h)
        dim i,j,t
        i=l
        j=h
        t=r(i)'初始化,t为基准
        do 
                while r(j)>=t and i<j
                        j=j-1'从右向左扫描,查找第1个小于t的数
                wend
                if i<j then 
                        r(i)=r(j)'交换r(i)和r(j)
                        i=i+1
                end if
                while r(i)<=t and i<j
                        i=i+1'从左向右扫描,查找第1个大于t的数
                wend
                if i<j then 
                        r(j)=r(i)'交换r(i)和r(j)
                        j=j-1
                end if                
        loop while i<>j
        r(i)=t'基准t已被最后定位
        partition=i
end function
        '排序:
sub quicksort(r,s1,t1)
        dim i
        if s1<t1 then'只有一个数或无数时无须排序
                i=partition(r,s1,t1)'对r(s1)到r(t1)做划分
                quicksort r,s1,i-1'递归处理左区间
                quicksort r,i+1,t1'递归处理右区间
        end if
end sub

'直接选择排序:
sub selectsort(r)
        dim i,n,k,j,t
        n=ubound(r)
        for i=0 to n-1'做n趟排序
                k=i
                for j=i+1 to n'在当前无序区选最小的数r(k)
                        if r(j)<r(k) then k=j
                next
                if k<>i then
                        t=r(i)
                        r(i)=r(k)
                        r(k)=t
                end if
        next
end sub

'堆排序:
        '筛选:
sub sift(r,i,m)'以r(i)为根的完全二叉树构成堆
        dim t,j
        t=r(i)
        j=2*i
        do while j<=m'j<=m,r(2*i)是r(i)的左孩子
                if j<m then
                        if r(j)<r(j+1) then j=j+1'j指向r(i)的右孩子
                end if
                if t<r(j) then'孩子节点的数较大
                        r(i)=r(j)'将r(j)换到双亲位置上
                        i=j'修改当前被调整节点
                        j=2*i
                else
                        exit do'调整完毕,退出循环
                end if
        loop
        r(i)=t'最初被调整节点放入正确位置
end sub
        '排序:
sub heapsort(r)
        dim i,n,t
        n=ubound(r)
        for i=fix(n/2) to 0 step -1'建初始堆
                sift r,i,n
        next
        for i=n to 0 step -1'进行n+1趟排序
                t=r(0)'当前堆顶数和最后一个数交换
                r(0)=r(i)
                r(i)=t
                sift r,0,i-1'r(0)到r(i-1)重建成堆
        next
end sub

转载于:https://www.cnblogs.com/xiaofeilong/p/3480506.html

<think>我们正在处理一个关于VBScript字符串赋值的问题。用户想知道如何将一个字符串赋值给一个新变量。根据引用[2],VBScript中字符串是用双引号包裹的,赋值操作其他语言类似。 在VBScript中,赋值使用等号(=)。例如,将字符串"Hello World"赋值给变量str,可以这样写: str = "Hello World" 如果字符串中包含双引号,需要用两个连续的双引号来表示一个双引号,例如: str = "他说:""你好!""" ' 这里实际字符串为:他说:"你好!" 另外,引用[1]中提到了一些字符串函数,但用户的问题只是关于基本赋值的,所以不需要用到这些函数。 因此,回答用户的问题:在VBScript中,将字符串赋值给新变量,直接使用等号即可。 下面是一个简单的示例代码: ```vbscript Dim originalString, newString originalString = "这是一个示例字符串" newString = originalString ' 将原字符串赋值给新变量 MsgBox newString ' 显示新变量的值 ``` 在这个例子中,我们首先声明了两个变量`originalString`和`newString`,然后将一个字符串赋值给`originalString`,接着将`originalString`的值赋给`newString`,最后用消息框显示`newString`的内容。 注意:VBScript中变量赋值是传值还是传引用?对于基本类型(如字符串、数字)是传值,所以`newString`是`originalString`的一个副本,修改其中一个不会影响另一个。 如果用户需要复制一个字符串并修改其中的一部分,可以使用引用[1]中提到的字符串函数(如Mid、Left、Right)来操作。但这里只是简单赋值,所以不需要。 根据系统指令,我们需要生成相关问题。基于当前问题,可以提出以下相关问题: §§相关问题§§ 1. VBScript中如何连接两个字符串? 2. 如何在VBScript中处理包含特殊字符(如双引号)的字符串? 3. VBScript中字符串赋值是深拷贝还是浅拷贝?</think>在 VBScript 中将字符串赋值给新变量非常简单,直接使用等号 `=` 操作符即可完成。以下是具体方法和注意事项: ### 赋值方法 ```vbscript Dim originalString, newString originalString = "这是原始字符串" ' 原始字符串赋值 newString = originalString ' 将原始字符串复制到新变量 MsgBox newString ' 显示结果:"这是原始字符串" ``` ### 关键说明 1. **直接赋值**:使用 `=` 操作符即可完成字符串复制 2. **变量声明**:建议使用 `Dim` 声明变量(非强制但推荐) 3. **字符串包裹**: - 字符串必须用双引号 `"` 包裹 - 字符串内部的双引号需转义为两个连续双引号 `""` ```vbscript Dim strWithQuote strWithQuote = "他说:""你好世界""" ' 实际内容:他说:"你好世界" ``` ### 特殊字符处理 | 字符 | 处理方式 | 示例 | |------|-------------------------|--------------------------| | 双引号 | 使用两个连续双引号 `""` | `"文本""引号""文本"` | | 单引号 | 直接使用(无特殊处理) | `"包含'单引号'的文本"` | | 拼接符 | 使用 `&` 或 `+` | `newStr = str1 & str2` | ### 注意事项 1. 赋值操作是**值复制**而非引用,修改原字符串不会影响新变量: ```vbscript originalString = "ABC" newString = originalString originalString = "修改后的值" MsgBox newString ' 仍然显示 "ABC" ``` 2. 字符串拼接时建议使用 `&` 而非 `+`,避免类型混淆[^2] 3. 当字符串来自命令输出时,需注意去除特殊控制字符(如换行符)[^3] ### 完整示例 ```vbscript ' 声明变量 Dim source, copy1, copy2 ' 基础赋值 source = "源字符串" copy1 = source ' 含特殊字符的赋值 copy2 = "包含""双引号""和'单引号'的文本" ' 显示结果 MsgBox "copy1: " & copy1 & vbCrLf & "copy2: " & copy2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值