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#程序设计有所帮助。

(0)

相关推荐

  • C#学习笔记- 浅谈数组复制,排序,取段,元组

    C#学习笔记- 浅谈数组复制,排序,取段,元组 using System; using System.Collections.Generic; namespace Application { class Test { static void Main () { //元组类型Tuple是静态类型,用静态方法创建实例,超过8个元素则第8个元素是元组类型 var tupe = Tuple.Create<int,int,string,string> (1, 2, "a", &quo

  • C# 数组查找与排序实现代码

    1. 查找对象 复制代码 代码如下: Person p1 = new Person( " http://www.my400800.cn " , 18 ); Person p2 = new Person( " http://www.my400800.cn " , 19 ); Person p3 = new Person( " http://www.my400800.cn " , 20 ); Person[] persons = ... { p1,

  • C#基础之数组排序、对象大小比较实现代码

    从个小例子开始: 复制代码 代码如下: int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i)); 这个例子定义了一个int数组,然后使用Array.Sort(arr)静态方法对此数组进行排序,最后输出排序后的数组.以上例子将毫无意外的依次输出1,2,3,4,5,6. 为什么Array的Sort方法可以正确的对i

  • C#数组排序的两种常用方法

    本文实例讲述了C#数组排序的两种常用方法.分享给大家供大家参考.具体如下: 1.第一个例子 定义代码 #region Array数组排序1 public class Pigeon : IComparable<Pigeon> //类元素本身继承比较接口 { int XValue; int YValue; public string BatchNo { get; set; } public int CompareTo(Pigeon other) { if (other == null) throw

  • C#求数组中元素全排列的方法

    本文实例讲述了C#求数组中元素全排列的方法.分享给大家供大家参考.具体如下: 1.算法描述 全排列的第一项是该数组的升序排列,最后一项是该数组的降序排列.本文中用到的了一个函数FindNextArray:从升序排列开始,不断使用函数FindNextArray,可以遍历全部排列,最终到达数组中元素的降序排列. FindNextArray函数的实现思路: 设有数组array为原数组的一个排列 1)找出数组的最大值 2)从后向前找:找到第一组array[i]>array[i-1]的数,以i位置为sig

  • python获取元素在数组中索引号的方法

    本文实例讲述了python获取元素在数组中索引号的方法.分享给大家供大家参考.具体如下: 这里python是通过index方法获取索引号的 li = ['a', 'b', 'new', 'D', 'z', 'example', 'new', 'two', 'elements'] print li.index("example") print li.index("new") print li.index("z") print "c&quo

  • Javascript循环删除数组中元素的几种方法示例

    本文主要跟大家分享了关于Javascript循环删除数组中元素的几种方法,分享出来供大家参考学习,下面来看看详细的介绍: 发现问题 大家在码代码的过程中,经常会遇到在循环中移除指定元素的需求.按照常规的思路,直接一个for循环,然后在循环里面来个if判断,在判断中删除掉指定元素即可.但是实际情况往往不会像预想的那样顺利运行. 下面以一段Javascript代码为例演示这一过程. (function () { var arr = [1,2,2,3,4,5]; var len = arr.lengt

  • javascript中去除数组重复元素的实现方法【实例】

    在实际应用中,我们很多时候都可能需要去除数组中的重复元素,下面就是javascript数组去重的方法实现: <script language="javascript"> <!-- /*判断数组中是否存在某个元素的方法*/ function isExistInArr(_array, _element){ if(!_array || !_element) return false; if(!_array.length){ return (_array == _elemen

  • 深入线性时间复杂度求数组中第K大数的方法详解

    求数组中第K大的数可以基于快排序思想,步骤如下:1.随机选择一个支点2.将比支点大的数,放到数组左边:将比支点小的数放到数组右边:将支点放到中间(属于左部分)3.设左部分的长度为L,当K < L时,递归地在左部分找第K大的数当K > L时,递归地在有部分中找第(K - L)大的数当K = L时,返回左右两部分的分割点(即原来的支点),就是要求的第K大的数以上思想的代码实现如下: 复制代码 代码如下: /**线性时间复杂度求数组中第K大数** author :liuzhiwei ** data 

  • javascript过滤数组重复元素的实现方法

    javascript过滤数组重复元素的实现方法 以下是在网上找的资料,直接在项目中可以使用,大家可以参考下: 实现代码: function filterArray(receiveArray){ var arrResult = new Array(); //定义一个返回结果数组. for (var i=0; i<receiveArray.length; ++i) { if(check(arrResult,receiveArray[i]) == -1) { //在这里做i元素与所有判断相同与否 ar

  • Python 比较两个数组的元素的异同方法

    通过set()获取两个数组的交/并/差集: print set(a).intersection(set(b)) # 交集 print set(a).union(set(b)) # 并集 print set(a).difference(set(b)) # 差集,在a中但不在b中的元素 print set(b).difference(set(a)) # 差集,在b中但不在a中的元素 以上这篇Python 比较两个数组的元素的异同方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多

  • JavaScript使用二分查找算法在数组中查找数据的方法

    本文实例讲述了JavaScript使用二分查找算法在数组中查找数据的方法.分享给大家供大家参考.具体分析如下: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一

  • js求数组中全部数字可拼接出的最大整数示例代码

    前言 最近在工作碰到一个问题,就是用javascript求数组中所有数字能拼接出的最大整数,数组的每一项为单独的拼接项,不能再拆开,例如[2,34]中2和34分别为要被拼接的数字,而不是说34还能继续拆分为3和4. 具体需求为,将[7,321,35,4]拼接为7435321.下面话不多说了,来一起看看详细的实现方法吧. 我设计的算法如下: function insertSort(arr) { let res = [arr[0]]; for (let i = 1, len = arr.length

  • C++二分法在数组中查找关键字的方法

    本文实例讲述了C++二分法在数组中查找关键字的方法.分享给大家供大家参考.具体如下: /* 此程序演示了二分法查找算法(针对按从小到大排列的数组)的实现. */ #include <iostream> using namespace std; /* 功能: 实现数组的二分法查找(只算法只适合按从小到大排列的数组) 返回值:关键字在数组中的下标, 返回-1表示未找到 a[]: 要搜索的数组 len: 数组元素个数 key: 要查找的关键字 */ int binSearch(int a[], in

随机推荐