回 帖 发 新 帖 刷新版面

主题:排序中,插入数。。N题

(最好用多种方法)

1。有序数10个从小到大已排序。输入一数,要求仍有序(为什么要是这数为最大时,就变为0了呢?)


2。有M个整数,逐个插入到数组中(数组中数据个数最初为0),使M个数插入完成后,数组中的数已经排好序。


3。调用随机数,产生30个二位随机整数,用冒泡法从小到大的顺序存入到数组中,输入要插入的数x,使它插入后仍有序。不断重复此过程,直到给x输入为-1时结束。。


*解释*

回复列表 (共13个回复)

沙发

其实你说的三个问题都是一个事情
就是一个数如何插到有序数列中去

1. 确定数列是顺序(从小到大)还是倒序(从大到小)

2. 找到列首(最小值)和列尾(最大值)

3. 把已知数与最小值,最大值比较
    4. 比最小值小,排在最小值前面
    5. 比最大值大,排在最大值后面

6. 在最小值和最大值的中间位置取一个中间值,
    7. 将已知数与中间值比较
       8.比中间值大: 把中间值作为新的最小值
       9.比中间值小: 把中间值作为新的最大值
      10.重复6-10步
11. 直到最小值与最大值位置相邻为止。
12. 确定已知数的新位置,把其后数列顺后推一位,把已知数插到目标位置

板凳

是都围绕着一个插入数的问题.但分别插入一个数,或多个数,或在一数组为0时(指的是什么意思?)      
   比如第一题:我做出来(从小到大)其他插入的数都可行的,但是要是插入一个最大数时就显示为0..不知道是为什么,我大约明天的时候把那错误的程序输上来,帮忙分析一下.    (呵呵,有具体简单的程序更好)

3 楼

你们都喜欢用数组,我就用数组举例吧,其实在我的质数的程序都有的:

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 楼

哦谢谢。。。先。


我不太习惯用子程序做。

5 楼

那不简单
你把inss与return之间的东西代替gosub就得了。

这样写的原因是为了把功能模块明显化,比较容易理解过程的作用。

6 楼

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 楼

订证:
FOR k = 1 TO 10
IF x < a(k) THEN EXIT FOR
NEXT k

8 楼

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 楼

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 楼

好好好厉害。。。一眼就看出来。。。。小女子佩服呀。。[em28][em28][em28][em28][em28][em28][em28][em28][em1]

我来回复

您尚未登录,请登录后再回复。点此登录或注册