1. 程式人生 > >約瑟夫環陣列實現

約瑟夫環陣列實現

以前貌似寫過,但早已忘了。個人覺得約瑟夫環用單鏈表的話比較好理解,節點出列直接刪掉就好,環的迴圈可以用迴圈連結串列。但陣列實現的話程式碼會少一些,所以心血來潮決定用陣列來寫。

雖然用陣列,但邏輯也好理解,被選定的數把它賦值為-1表示出列,下標越界時與陣列個數作下模運算即可。程式碼如下,只在網上找了幾個用例測了下無誤,但不保證絕對正確(例如要過leetcode的測試):

void circle_sort (int n, int s, int m, int *p) {
    char *joseph = (char *)calloc(n + 1, sizeof(char));
    for (int i = 0; i < n; i++)
        joseph[i] = i + 1;
    int count = n;
    int index = 0, icur = s - 1;
    int ip = 0;
    //
    for (int i = 0; i < n; i++)
        printf("%d ", joseph[i]);
    printf("\n");
    //
    while (count > 0) {
        printf("\n");
        while (index != m) {
            if (joseph[icur] != -1 && icur < n) { //正常過
                printf("%d", joseph[icur]);
                index++;
                if (index < m) //關鍵語句,控制icur與停留在當前已被選中的約瑟夫數字,而不是下一位
                    icur++;
            }
            else if (joseph[icur] == -1 && icur < n) { //遇到已出列數字
                icur++;
            }
            else if (icur >= n ) { //2次迴圈
                icur = icur % n ;
            }
        }
        p[ip++] = joseph[icur];
        printf(" jo-->%d\n", joseph[icur]);
        joseph[icur] = -1;
        index = 0;
        count--;
    }
    free(joseph);
}