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 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.从后向前找:找到第一组后数大于前数,以后数位置为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

C#求数组中元素的全排列相关推荐

  1. 求数组中元素的平均值

    package com.test; public class Test {public static void main(String[] args){int[] arr = {1,2,3,4,5,6 ...

  2. Bad Hair Day(求数组中元素和它后面离它最近元素之间的元素个数)

    题目链接:https://ac.nowcoder.com/acm/contest/984/A 链接:https://ac.nowcoder.com/acm/contest/984/A 来源:牛客网 B ...

  3. 求数组中元素为另外两个元素和的最大元素

    对于正数数组A[n], 找出A[i] = A[x]+A[y]的A[i]的最大值. 先对数组排序 然后从大到小进行搜索 搜索算法就是在开始一个指针beg,最后一个指针end, 如果a[beg] + a[ ...

  4. 如何求数组中绝对值最小的数?

    """ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...

  5. java求数组中满足给定和的数对_关于数组的几道面试题 - zdd - 博客园

    2011年2月15日更新,加入找出绝对值最小的元素一题 数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考,如果您有更好的题目或者想法,欢迎留言讨论.目前有以下1 ...

  6. 动态规划系列---求数组中两个元素差的最大值

    题目 求数组中两个元素差的最大值(后面的元素减去前面的元素):对应实际生活中的股票买卖,找出一只股票走势里面可能的最大收益: 思路 类似于求数组连续和的最大值:  保存最大差值和最小值,遍历数组,如果 ...

  7. 分治法求数组中的最大最小元素

    #include<iostream> using namespace std; //分而治之法求数组中的最大最小元素 void maxmin(int i,int j,int A[],int ...

  8. 求出数组中元素的总和_数组中所有元素的总和可被给定数K整除

    求出数组中元素的总和 This program will help to find out the sum of elements in an array which is divisible by ...

  9. 数组小案例(求数组最大最小值、反转数组中元素、指定元素第一次出现的索引)

    数组小案例(求数组最大最小值.反转数组中元素.指定元素第一次出现的索引) 练习1 数组最值的求取 定一个数组,求数组中的最大值和最小值 public class Demo01 {public stat ...

最新文章

  1. linux查询重复数据库,Linux如何使用locate命令查找数据搜索数据库
  2. 阿里官方Redis开发规范!
  3. 假3D场景逼真到火爆外网!超1亿像素无死角,被赞AI渲染新高度
  4. 深度学习在计算机视觉领域(包括图像,视频,3-D点云,深度图)的应用一览
  5. 3-3.HDFS项目实战目标和要求
  6. 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现
  7. jdk1.5、1.6、1.7新特性详细介绍(整理)
  8. Bootstrap3系列:按钮组
  9. 用好文本框间的链接功能
  10. JAVA计算机毕业设计学生请假管理系统Mybatis+系统+数据库+调试部署
  11. 【C++零散】计时chrono
  12. elasticsearch使用7大原则,轻松玩转ES
  13. 2021-2027全球与中国牛肉罐头市场现状及未来发展趋势
  14. python——合数分解
  15. 应用中心服务器连接不上,Discuz!论坛:您的服务器无法访问应用中心,这将会导致应用无法安装的解决办法...
  16. 使用chrome保存完整网页为长图片
  17. 机器学习 - 学习理论
  18. cherry机械键盘维修记
  19. 二次函数顶点式计算机,二次函数顶点式是什么
  20. 测试晶面间距软件_测定晶体的晶面间距

热门文章

  1. 《Head First设计模式》第九章(1)迭代器模式
  2. insert函数的修改,
  3. C++(STL):16---deque之常规用法
  4. 二分法查找c语言程序_C语言的那些经典程序 第十四期
  5. 使用引用的方式交换数据的数值
  6. 线程安全和对应的核心概念
  7. .NET技术+25台服务器怎样支撑世界第54大网站
  8. 身体曲线如何反映出健康
  9. 多个 VUE 前端工程部署设置、nginx 代理配置
  10. eclipse快速定位到错误处