程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#求數組中元素全分列的辦法

C#求數組中元素全分列的辦法

編輯:C#入門知識

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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved