C#求數組中元素全分列的辦法。本站提示廣大學習愛好者:(C#求數組中元素全分列的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#求數組中元素全分列的辦法正文
本文實例講述了C#求數組中元素全分列的辦法。分享給年夜家供年夜家參考。詳細以下:
1.算法描寫
全分列的第一項是該數組的升序分列,最初一項是該數組的降序分列。本文頂用到的了一個函數FindNextArray:從升序分列開端,赓續應用函數FindNextArray,可以遍歷全體分列,終究達到數組中元素的降序分列。
FindNextArray函數的完成思緒:
設稀有組array為原數組的一個分列
1)找出數組的最年夜值
2)從後向前找:找到第一組array[i]>array[i-1]的數,以i地位為signer
3)從signer向後找:找到年夜於且最接近於array[signer-1]的數array[t]
4)將找到的array[t]和array[signer-1]交換
5)為地位signer以後的元素升序排序
所得的新數組即為原數組的一個新分列
2.相干函數
/// <summary> /// 輸入一個數組的全分列 /// </summary> /// <param name="array"></param> private static void PrintFullPermutation(int[] array) { //0.正當性校驗 if (array == null || array.Length == 0) { return; } //1.復制一個新數組:修正時在暫時數組中修正 int[] temp = new int[array.Length]; for (int i = 0; i < array.Length; i++) { temp[i] = array[i]; } //2.將新數組升序分列 int itemp; for (int i = 0; i < temp.Length; i++) { for (int j = i; j < temp.Length; j++) { itemp = array[i]; array[i] = array[j]; array[j] = itemp; } } //3.順次尋覓並打印全排序 PrintArray(temp); while (!isDesc(temp)) { FindNextArray(temp); PrintArray(temp); } } /// <summary> /// 打印數組 /// </summary> /// <param name="array">數組</param> private static void PrintArray(int[] array) { for (int i = 0; i < array.Length; i++) { Console.Write(array[i].ToString() + '\t'); } Console.WriteLine(); } /// <summary> /// 斷定一個數組內元素能否降序分列 /// </summary> /// <param name="array">數組</param> /// <returns></returns> private static bool isDesc(int[] array) { int temp=array[0]; for (int i = 1; i < array.Length; i++) { if (array[i] > array[i - 1]) { return false; } } return true; } /// <summary> /// 找到下一組分列 /// </summary> /// <param name="array"></param> private static void FindNextArray(int[] array) { //1.找出數組的最年夜值 int max = array[0]; for (int i = 1; i < array.Length; i++) { if (max < array[i]) { max = array[i]; } } //2.從後向前找:找到第一組後數年夜於前數,今後數地位為signer int signer = array.Length - 1; for (int i = array.Length - 1; i > 0; i--) { if (array[i] > array[i - 1]) { signer = i; break; } } //3.從signer向後找:找到年夜於且最接近於array[signer-1]的數array[t] int t = signer; for (int i = signer; i < array.Length; i++) { if (array[i] > array[signer - 1] && array[i] < max) { t = i; max = array[t]; } } //4.將找到的array[t]和array[signer-1]交換 int temp = array[t]; array[t] = array[signer - 1]; array[signer - 1] = temp; //5.為signer以後的元素升序排序 for (int i = signer; i < array.Length; i++) { for (int j = i + 1; j < array.Length; j++) { if (array[i] > array[j]) { temp = array[i]; array[i] = array[j]; array[j] = temp; } } } }
3.Main函數挪用
static void Main(string[] args) { //求1234四個數字的全分列 int[] array = new int[] { 1, 2, 3, 4 }; PrintFullPermutation(array); Console.ReadLine(); }
4.法式運轉示例
願望本文所述對年夜家的C#法式設計有所贊助。