大德通众包 做网站怎么样,微信小程序怎么推广,phpstorm做网站,郑州小程序开发费用2019独角兽企业重金招聘Python工程师标准 1.算法描述 全排列的第一项是该数组的升序排列#xff0c;最后一项是该数组的降序排列。本文中用到的了一个函数FindNextArray#xff1a;从升序排列开始#xff0c;不断使用函数FindNextArray#xff0c;可以遍历全… 2019独角兽企业重金招聘Python工程师标准 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 namearray/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 namearray数组/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 namearray数组/param
/// returns/returns
private static bool isDesc(int[] array)
{int temparray[0];for (int i 1; i array.Length; i){if (array[i] array[i - 1]){return false;}}return true;
}/// summary
/// 找到下一组排列
/// /summary
/// param namearray/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.从后向前找找到第一组后数大于前数以后数位置为signerint 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.程序运行示例 END 转载于:https://my.oschina.net/Tsybius2014/blog/229435