我自己写的代码很笨重,主要是搜索下一开始位置时,是逐行扫描的,效率不高.
而且,我没有用数组,用的游标,因为在vfp环境下,我认为没有哪个数组能比游标效率更高了.
如果你用C,VB,java,Python,用数组/列表 这些模型,都可以讨论.
我的代码如下:

程序代码:
CLEAR 
CLOSE TABLES ALL 
CREATE CURSOR TT (ID i ,cname c(1) ,XH I ,ALIFE L,memo1 c(20)) 
LOCAL II AS Integer ,icnt as Integer ,ilc as Integer ,ilocate as Integer
* 建立初始模型,顺便模拟首轮排序。
FOR II = 65 TO 73
    INSERT INTO TT (ID,cname,XH,ALIFE) VALUES (II - 64,CHR(II) ,II - 64,.T.)
ENDFOR 
ilc =1  && 第?轮 
SELECT tt
COUNT FOR alife TO icnt 
DO WHILE icnt  > 1 
    IF ilc =1 THEN   && 确定开始位置
        ilocate=SetOrder(1) 
    ELSE 
        ilocate=SetOrder(ilocate) 
    ENDIF 
    * 处理本轮退出的.
    LOCATE FOR xh = 5 AND alife
    IF FOUND() THEN 
        REPLACE alife WITH .f. ,memo1 WITH '第' + LTRIM(STR(ilc))  + '轮退出'
        ? '第' + LTRIM(STR(ilc))  + '轮,' + cname + '同学退出...下一轮将从ID=' + ;
            LTRIM(STR(ilocate)) + '的' + CHR(ilocate + 64) + '同学开始...'
    ELSE 
        ? 'Error ... 意外情况' 
    ENDIF 
    ilc = ilc + 1
    COUNT FOR alife TO icnt 
    IF icnt = 1 THEN 
        LOCATE FOR alife 
        ? '目前在第' + LTRIM(STR(ilc))  + '轮,只剩下' + cname + '同学一人,游戏结束.'
        EXIT 
    ENDIF 
ENDDO 
FUNCTION  SetOrder(startxh) as Integer
* 参数:1开始的位置 
LOCAL ncnt as Integer
LOCAL ilot as Integer 
LOCAL lfund as Boolean 
    SELECT tt
    REPLACE xh WITH 0 FOR  alife
    COUNT FOR  alife TO ncnt
    IF ncnt >1 THEN 
        IF startxh > RECCOUNT() THEN 
            GO 1
        ELSE 
            GO startxh            
        ENDIF 
        ii = 1 
        DO WHILE ii< 6 
            IF  alife THEN 
                REPLACE xh WITH ii 
                ii = ii + 1
                SKIP 
                IF  EOF() THEN 
                    GO 1
                ENDIF 
            ELSE 
            * 后面几轮,会进入这个分支
                SKIP 
                IF  EOF() THEN 
                    GO 1
                ENDIF                     
            ENDIF 
        ENDDO 
        * 返回下次应开始的位置:
        LOCATE FOR xh = 5 AND alife 
        IF FOUND() THEN 
            ilot = id  && 暂时的
            DO WHILE lfund  =.f. 
                IF alife AND xh<> 5 THEN 
                    ilot = id 
                    lfund  =.t. 
                ELSE 
                    SKIP 
                    IF EOF() THEN 
                        GO 1
                    ENDIF         
                ENDIF 
            ENDDO 
            RETURN ilot 
        ENDIF     
    ELSE 
    * 说明只剩下最后一个了,不再循环,因为没有意义了.
        RETURN 0 
    ENDIF 
ENDFUNC