實現元素的全排列

2022-04-03 23:16:16 字數 2912 閱讀 7638

想到 前幾天的乙個問題,如何實現元素的全排列 並且按照公升序輸出。

可以有兩種方法:遞迴和非遞迴

首先介紹非遞迴的方法:

思路:以三個數字為例1,2,3公升序的全排列為:

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

顯然每個組合  都有乙個直接後繼,找到乙個數沒有後繼如 3 2 1 則停止。

問題來了 那就是如何找到後繼和沒有後繼的數如何判斷該數是否有後繼。就是對於乙個數,如何找到乙個比它大的,且最小的數.

還是1 2 3為例  ,假設 此時的排列為"1 3 2" ,那麼32是非遞增的,而13是遞增的,滿足要求,然後根據要求2是比1大的最小的數,此時交換兩個數的位置得到2 3 1 ,此時 把交換位置後面的數字顛倒反轉即可。得到2 1 3 ,後面的排列都需要這麼做,直到碰到3 2 1即可。

**如下

1:

public

class nonrecursivepermutation ;

4:

static

int count = 1;

5:

6:

// 反轉區間

7:

private

static

void reverse(int arr, int pbegin, int pend)

11:

12:

private

static

void swap(int arr, int i, int j)

18:

19:

private

static

boolean hasnext()

24:

return false;

25:     }

26:

27:

private

static

void next()

37:         }

38:

39:

"需替換數字置:" + replace);

40:

41:

// 從後向前找比替換數大的第乙個數

42:

// 比如926540的後繼應該是946520,而不是956240

43:

for (int i = len - 1; i > replace; i--)

48:         }

49:

50:

"替換數字置:" + firstr);

51:

52:

// replace與firstr交換

53:         swap(arr, replace, firstr);

54:

// 替換數後的數全部反轉

55:         reverse(arr, replace + 1, len - 1);

56:

57:         count++;

58:         print();

59:     }

60:

61:

private

static

void print()

66:

67:

/**

68:

* @param args

69:

*/

70:

public

static

void main(string args)

75:         system.out.println("陣列完全反轉後的結果:");

76:         reverse(arr, 0, arr.length - 1);

77:         print();

78:         system.out.println("全排列的數目為:" + count);

79:

80:

/*********************/

81:         system.out.println("陣列是否存在後繼:" + hasnext());

82:         system.out.println("陣列一次替換後的結果:");

83:         next();

84:     }

85:

}

**的核心部分是在next和hasnext函式中。

(下篇文章介紹遞迴的方法)

JavaScript實現元素全排列

n 個不同元素中任意選取 m m n 個元素進行排列,所有排列情況的個數叫做排列數,其值等於 a n n m 表示數學中的階乘運算子,可以通過以下函式實現 function factorial n else if n 0 else console.log factorial 4 24 當 n m 時...

陣列元素全排列(c c 實現)

其實全排列的說白了就是,元素之間兩兩交換,交換後對其他元素進行全排,全排完其他元素,再把原先交換的那兩個元素交換回來。不過這個過程要靠遞迴實現,需要對遞迴的知識有一定的把握。下面附上 本人菜雞,初入部落格,大神多多指教。include bits stdc h using namespace std ...

全排列的實現

在c 的模板中,有一對專門用於實現數字或字元全排列的模板 next permutation biter,biter 和prev permutation biter,biter 前者實現向後排列,後者實現向前排列,即前者在原順序上依次產生較大的排列,後者則相反。舉個例子 假設需要產生以 354 為基礎...