主题:排序中,插入数。。N题
冰睛
[专家分:30] 发布于 2005-12-26 20:27:00
(最好用多种方法)
1。有序数10个从小到大已排序。输入一数,要求仍有序(为什么要是这数为最大时,就变为0了呢?)
2。有M个整数,逐个插入到数组中(数组中数据个数最初为0),使M个数插入完成后,数组中的数已经排好序。
3。调用随机数,产生30个二位随机整数,用冒泡法从小到大的顺序存入到数组中,输入要插入的数x,使它插入后仍有序。不断重复此过程,直到给x输入为-1时结束。。
*解释*
回复列表 (共13个回复)
沙发
moz [专家分:37620] 发布于 2005-12-27 13:48:00
其实你说的三个问题都是一个事情
就是一个数如何插到有序数列中去
1. 确定数列是顺序(从小到大)还是倒序(从大到小)
2. 找到列首(最小值)和列尾(最大值)
3. 把已知数与最小值,最大值比较
4. 比最小值小,排在最小值前面
5. 比最大值大,排在最大值后面
6. 在最小值和最大值的中间位置取一个中间值,
7. 将已知数与中间值比较
8.比中间值大: 把中间值作为新的最小值
9.比中间值小: 把中间值作为新的最大值
10.重复6-10步
11. 直到最小值与最大值位置相邻为止。
12. 确定已知数的新位置,把其后数列顺后推一位,把已知数插到目标位置
板凳
冰睛 [专家分:30] 发布于 2005-12-27 21:50:00
是都围绕着一个插入数的问题.但分别插入一个数,或多个数,或在一数组为0时(指的是什么意思?)
比如第一题:我做出来(从小到大)其他插入的数都可行的,但是要是插入一个最大数时就显示为0..不知道是为什么,我大约明天的时候把那错误的程序输上来,帮忙分析一下. (呵呵,有具体简单的程序更好)
3 楼
moz [专家分:37620] 发布于 2005-12-27 23:47:00
你们都喜欢用数组,我就用数组举例吧,其实在我的质数的程序都有的:
dim s(100) '[color=FF00FF]以这个数列为例[/color]
input s(1) '[color=FF00FF]这是第一个元素[/color]
k=1 '[color=FF00FF]有效元素的个数[/color]
for i=2 to 100 '[color=FF00FF]后面输入的数列[/color]
input a '[color=FF00FF]键盘输入一个数[/color]
gosub inss '[color=FF00FF]为了减少参数传递或共享的消耗[/color]
next '[color=FF00FF]我用了跳转子程序,好看一点[/color]
cls '[color=FF00FF]显示结果[/color]
for i=1 to 100
print s(i),
next
end
inss: '[color=FF00FF]插入过程[/color]
if a<s(1) then '[color=FF00FF]比最小值小[/color]
r=1 '[color=FF00FF]那就排第一[/color]
elseif a>s(k) then '[color=FF00FF]比最大值大[/color]
r=k+1 '[color=FF00FF]那就排最后[/color]
else
l=1 '[color=FF00FF]左边端点[/color]
r=k '[color=FF00FF]右边端点[/color]
do '[color=FF00FF]进循环[/color]
m=(r+l)\2 '[color=FF00FF]取线段中点[/color]
if a>s(m) then l=m else r=m '[color=FF00FF]与中点作比较定新的端点[/color]
loop until r-l<2 '[color=FF00FF]两端点要相遇了,得到最后位置[/color]
endif '[color=FF00FF]到了这里就已经能确定 a 的新位置 r 了.[/color]
for j=r to k '[color=FF00FF]把目标位置之后的元素依次推后一位[/color]
s(j+1)=s(j)
next
s(r)=a '[color=FF00FF]插入目标位置[/color]
k=k+1 '[color=FF00FF]总元素加一[/color]
return
4 楼
冰睛 [专家分:30] 发布于 2006-01-05 17:53:00
哦谢谢。。。先。
我不太习惯用子程序做。
5 楼
moz [专家分:37620] 发布于 2006-01-05 18:56:00
那不简单
你把inss与return之间的东西代替gosub就得了。
这样写的原因是为了把功能模块明显化,比较容易理解过程的作用。
6 楼
冰睛 [专家分:30] 发布于 2006-01-10 14:50:00
DIM a(15)
FOR i = 1 TO 10
a(i) = INT(90 * RND) + 10
NEXT i
FOR i = 1 TO 9
FOR j = 1 TO 10 - i
IF a(j) > a(j + 1) THEN SWAP a(j), a(j + 1)
NEXT j: NEXT i
n = 10
INPUT x
FOR k = 1 TO 10
IF x < a(k - 1) THEN EXIT FOR
NEXT k
p = k
FOR i = n TO p STEP -1
a(i + 1) = a(i)
NEXT i
a(p) = x
n = n + 1
FOR i = 1 TO n
PRINT a(i);
NEXT i
END
插入一数为什么是错误的。。
如插入一数为:15
11 36 15 37 58 62 73 75 78 79 83
7 楼
冰睛 [专家分:30] 发布于 2006-01-10 14:57:00
订证:
FOR k = 1 TO 10
IF x < a(k) THEN EXIT FOR
NEXT k
8 楼
冰睛 [专家分:30] 发布于 2006-01-10 15:16:00
CLS
DIM a(100)
FOR i = 1 TO 10
a(i) = INT(90 * RND) + 10
NEXT i
FOR i = 1 TO 9
FOR j = 1 TO 10 - i
IF a(j) > a(j + 1) THEN SWAP a(j), a(j + 1)
NEXT j: NEXT i
n = 10
INPUT x
WHILE x <> -1
FOR k = 1 TO 10
IF x < a(k) THEN EXIT FOR
NEXT k
p = k
FOR i = n TO p STEP -1
a(i + 1) = a(i)
NEXT i
a(p) = x
n = n + 1
FOR i = 1 TO n
PRINT a(i);
NEXT i
INPUT x
PRINT
WEND
END
如假设一数列a(1)-a(10)的数为
11,36,37,58,62,73,73,78,79,83
插入的第一个数为:10
则显示: 10,11,36,37,58,62,73,73,78,79,83(正确)
插入第二数:45
则显示: 10,11,36,37,40,58,62,73,73,78,79,83(正确)
插入第三数:84
则显示: 10,11,36,37,40,58,62,73,73,84,78,79,83(错误)
插入第三数:91
则显示: 10,11,36,37,40,58,62,73,73,91,84,78,79,83(错误)
(为什么插入小于数列最大数83时都是正确的。而插入比83还大的数就出错了呢,这个程序错在哪里呢。在我原程序的基础上帮我改正一下,谢谢哦!!!!!)[em2]
9 楼
moz [专家分:37620] 发布于 2006-01-10 16:07:00
cls
dim a(100)
for i=1 to 10
a(i)=int(90 * rnd) + 10
next i
for i = 1 to 9
for j = 1 to 10 - i
if a(j) > a(j + 1) then swap a(j), a(j + 1)
next j,i
n = 10
input x
do while x <> -1
[color=FF00FF]for k = 1 to n '把10改成n [/color]
if x < a(k) then exit for
next k
p = k '[color=FF00FF] p,k 两个变量可以共享的 [/color]
for i = n to p step -1
a(i + 1) = a(i)
next i
a(p) = x
n = n + 1
for i = 1 to n
print a(i);
next i
input x
print
loop
end
10 楼
冰睛 [专家分:30] 发布于 2006-01-10 16:28:00
好好好厉害。。。一眼就看出来。。。。小女子佩服呀。。[em28][em28][em28][em28][em28][em28][em28][em28][em1]
我来回复