中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]********vbs各种排序********
作者:
标题: [原创]********vbs各种排序******** 上一主题 | 下一主题
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『楼 主』:  [原创]********vbs各种排序********

''''''''      排序      ''''''''
''''''''s11ss 2007-10-18''''''''

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
[ Last edited by s11ss on 2007-10-18 at 09:47 PM ]


   此帖被 +7 点积分      点击查看详情   
评分人:【 fastslz 分数: +3  时间:2007-10-18 23:44
评分人:【 my3439955 分数: +4  时间:2007-10-19 23:21


2007-10-18 21:36
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 2 楼』:  

强....看这个我功底还不够,学习..




2007-10-18 23:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 3 楼』:  

Originally posted by fastslz at 2007-10-18 11:44 PM: 强....看这个我功底还不够,学习..
我是看数据结构的书再写的....


2007-10-19 15:13
查看资料  发短消息  网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 4 楼』:  

最好。。。。名词解释


2007-10-19 18:03
查看资料  发短消息  网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 5 楼』:  

Originally posted by knoppix7 at 2007-10-19 06:03 PM: 最好。。。。名词解释
哦?这工作量也忒大了点儿吧?让版主来吧,我也不敢越俎代庖啊,呵呵。


2007-10-19 19:43
查看资料  发短消息  网志   编辑帖子  回复  引用回复
loloo
新手上路





积分 12
发帖 6
注册 2007-1-26
状态 离线
『第 6 楼』:  

基础不 好 !!得慢慢看!


2007-10-19 20:06
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  

s11ss兄为何不用批处理实现这些排序? ^_^


2007-10-20 06:21
查看资料  发短消息  网志   编辑帖子  回复  引用回复
putao
初级用户




积分 80
发帖 41
注册 2007-10-5
状态 离线
『第 8 楼』:  

学习




http://user.qzone.qq.com/182365808
2007-10-20 13:27
查看资料  发送邮件  发短消息  网志  OICQ (182365808)  编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 9 楼』:  

Originally posted by HAT at 2007-10-20 06:21 AM: s11ss兄为何不用批处理实现这些排序? ^_^
HAT兄这么说我真是哑口无言啊,你搜索一下就知道了.


2007-10-20 15:29
查看资料  发短消息  网志   编辑帖子  回复  引用回复
wydos
中级用户





积分 304
发帖 117
注册 2006-4-4
状态 离线
『第 10 楼』:  

收藏了!!


2007-10-20 18:12
查看资料  发送邮件  发短消息  网志  OICQ (327337973)  编辑帖子  回复  引用回复
gne
初级用户




积分 77
发帖 45
注册 2007-8-3
状态 离线
『第 11 楼』:  

学习




因为喜欢,所以无悔!
2008-3-13 19:43
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
zerocq
中级用户




积分 458
发帖 196
注册 2006-10-5
状态 离线
『第 12 楼』:  

很好很强大,收藏


2008-3-13 23:06
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 13 楼』:  

近于天书啊,直是学海无边,回首汪洋啊,越是这样越觉得自己的贫乏


2008-3-14 09:12
查看资料  发送邮件  发短消息  网志  OICQ (841615149)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: