約瑟夫環陣列實現
阿新 • • 發佈:2019-02-03
以前貌似寫過,但早已忘了。個人覺得約瑟夫環用單鏈表的話比較好理解,節點出列直接刪掉就好,環的迴圈可以用迴圈連結串列。但陣列實現的話程式碼會少一些,所以心血來潮決定用陣列來寫。
雖然用陣列,但邏輯也好理解,被選定的數把它賦值為-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); }