`
solid210
  • 浏览: 52917 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

二维数组排序问题之一

阅读更多

最近做项目,遇到一个需求,需要用到下列排列组合方法,于是记下来,将来再遇到此类方法时,直接拿来用。
先设置几个数组
a1,a2,a3,a4    list[0]        长度4
b1,b2,b3        list[1]        长度3
c1,c2             list[2]        长度2
d1,d2,d3         list[3]        长度3
一共有4*3*2*3 = 72种组合(a1b1c1d1算是一种,但是b1a1c1d1等等内容相同,位置不同的不算)
是一个array[72]的数组
array[0] = list[0][0]list[1][0]list[2][0]list[3][0] = a1b1c1d1        1/72
array[1] = list[0][0]list[1][0]list[2][0]list[3][1] = a1b1c1d2        2/72
array[2] = list[0][0]list[1][0]list[2][0]list[3][2] = a1b1c1d3        3/72
array[3] = list[0][0]list[1][0]list[2][1]list[3][0] = a1b1c2d1        4/72
array[4] = list[0][0]list[1][0]list[2][1]list[3][1] = a1b1c2d2        5/72
array[5] = list[0][0]list[1][0]list[2][1]list[3][2] = a1b1c2d3        6/72
......
array[65] = list[0][3]list[1][1]list[2][1]list[3][2] = a4b2c2d3        66/72
array[66] = list[0][3]list[1][2]list[2][0]list[3][0] = a4b3c1d1        67/72
array[67] = list[0][3]list[1][2]list[2][0]list[3][1] = a4b3c1d2        68/72
array[68] = list[0][3]list[1][2]list[2][0]list[3][2] = a4b3c1d3        69/72
array[69] = list[0][3]list[1][2]list[2][1]list[3][0] = a4b3c2d1        70/72
array[70] = list[0][3]list[1][2]list[2][1]list[3][1] = a4b3c2d2        71/72
array[71] = list[0][3]list[1][2]list[2][1]list[3][2] = a4b3c2d3        72/72

找到规律:
array[i] = list[0][i / (3 * 2 * 3) % 4]list[1][i / (2 * 3) % 3]list[2][i / 3 % 2]list[3][i % 3]
或:
array[i] = list[0][i / (72 / 4) % 4]list[1][i / (72 / (4 * 3)) % 3]list[2][i / (72 / (4 * 3 * 2)) % 2]list[3][i /(72 / (4 * 3 * 2 * 3)) % 3]
==========================================================================
下列是一个比较死板的代码(因为数组是预先定义好的):
       

        String a[] = {"a1", "a2", "a3", "a4"};
        String b[] = {"b1", "b2", "b3"};
        String c[] = {"c1", "c2"};
        String d[] = {"d1", "d2", "d3"};
        int max = a.length * b.length * c.length * d.length;
        for (int i = 0; i < max; i++) {
            String str1 = a[i / (b.length * c.length * d.length) % a.length] + b[i / (c.length * d.length) % b.length] + c[i / (d.length) % c.length] + d[i % d.length];
            System.out.println("第 " + (i + 1) + " 个: " + str1);
        }

 
==========================================================================
再下列是比较灵活的代码,动态的:

        String[][] str = {{"a1", "a2", "a3", "a4"},
                                  {"b1", "b2", "b3"},
                                  {"c1", "c2"},
                                  {"d1", "d2", "d3"}};    //这个str可以换成动态的二维数组,或者list[]
        int max = 1;
        for(int i = 0; i < str.length; i++){
            max *= str[i].length;
        }
        
        for(int i = 0; i < max; i++){
            String s = "";
            int temp = 1;      //注意这个temp的用法。
            for(int j = 0; j < str.length; j++){
                temp *= str[j].length;
                s += str[j][i / (max / temp) % str[j].length];
            }
            System.out.println("第 " + (i + 1) + " 个: " + s);
        }

        System.out.println(max);

 
以上就是二维数组的排列组合方法。我不是数学天才,所以方法是按照正常的逻辑思维推导出来写的,估计肯定有效率极高、超级漂亮的算法,如果哪位仁兄看到我这篇文章,又恰巧知道更为漂亮的算法,希望不吝赐教。大家进步社会才会进步么。呵呵,说多了。

0
0
分享到:
评论
1 楼 ipandao 2010-01-27  
另注:我在你的网易博客有评论上面的代码

我把上面的代码改成PHP的了,不过还是有点不明白,想问你一下,规律是怎么算出来的,

i / (max / temp) % str[j].length <----这段代码是怎么想出来的?

能加你的QQ吗?

我的QQ是:272383090

贴一下PHP版的代码

//二维数组的排列组合方法
$array = array(
        "0" => array("绿色","白色", "黑色"),
        "1" => array("X", "XL"),
        "2" => array("围巾"," PHP")
);

$max = 1;
foreach($array as $val){
    $max *= count($val);
}

$result=array();
for($i = 0; $i < $max; $i++)
{
    $temp = 1; //注意这个temp的用法。
    for($j = 0; $j < count( $array ); $j++)
    {
        $count = count( $array[$j] );
        $temp *= $count;
        $result[$i] .= $array[$j][ $i / ( $max / $temp ) % $count ];
    }
}

print_r($result);



相关推荐

    C#实现对二维数组排序的方法

    总结来说,本文介绍的C#实现二维数组排序的方法,通过将二维数组转换为`DataTable`并利用其内置的排序功能,提供了一种灵活且高效的解决方案。这种方法不仅适用于各种数据类型,而且保持了原始数组的引用,使得排序...

    LabVIEW二维数组排序.rar

    总结来说,LabVIEW中的二维数组排序涉及理解二维数组的结构,掌握各种排序方法,包括按行、按列及自定义排序,以及处理数据类型转换和性能优化。熟练掌握这些技能将使你在LabVIEW编程中游刃有余,处理各种数据处理...

    二维数组排序

    // 二维数组冒泡排序 public static void main(String[] args) { int i=0, j=0, temp = 0; int[][] nums1 = { { 34, 1, 22, 5 }, { 28, 98, 15, 32 }, { 33, -5, 17, 41 } }; int rows = nums1.length; //二维...

    二维数组如何进行冒泡排序

    ### 二维数组冒泡排序详解 #### 一、引言 冒泡排序是一种简单的排序算法,在数据处理领域有着广泛的应用。对于一维数组而言,冒泡排序实现起来...希望本文能够帮助初学者更好地理解二维数组排序的原理和实现细节。

    VB.NET二维数组快速排序(更新)

    VB.NET二维数组快速排序(更新) 'OldArrays(),为排序二维数组;NewArrays(),为存放结果数组,SortColumnsOrOrders(),传递排序参数数组,偶数个为排序列号,奇数为升降序,0为升序,1为降序;FieldRow,是否有字段行...

    Labview二维数组排序

    不要看分数高,这个程序绝对可以对得起大家的分数。这个楼主的研究哈!反正下了评价后分数可以返还的................

    二维数组的四种排序(绝对经典)

    二维数组的排序,其中包含冒泡排序、选择排序、插入排序和快速选择排序。

    c语言二维数组冒泡排序

    如果需要根据其他列进行排序,或者实现完全的二维数组排序(比如按照行和列的组合排序),则需要更复杂的逻辑。例如,你可以先按照第一列排序,然后再对每一行的子序列按照第二列排序,以此类推。这将涉及到嵌套排序...

    VB二维数组排序源码

    VB二维数组排序源码

    java_二维数组冒泡行列排序源代码

    使用冒泡排序实现的java语言编写的关于二维数组的排序,实现了行、列的排序输出。

    根据二维数组的第一列数值大小排序

    在给定的描述中,提到了根据二维数组的第一列数值进行排序的需求。这通常涉及到两种排序方式:降序和升序。降序排序意味着将第一列的数值从大到小排列,而升序排序则是从小到大排列。在编程中,实现这种排序可以通过...

    二维数组排序.vi二维数组排序.vi

    二维数组排序.vi

    用for循环对二维数组进行逐行排序

    用labview在While循环中实现二维数组的逐行排序,用两个for循环

    二维数组排序按照某个字段正序或倒序排列 函数

    解决二维数组的排序问题 二维数组排序按照某个字段正序或倒序排列 函数

    使用php对二维数组按数组值进行排序

    以下是一个具体示例,展示了如何按照二维数组中的特定键(例如“score”)对数组进行升序排序: ```php // 假设我们有以下二维数组 $students = array( array('name' =&gt; '张三', 'score' =&gt; 85), array('name' =...

    二维数组排序.zip源码Labview个人项目资料程序资源下载

    二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源下载二维数组排序.zip源码Labview个人项目资料程序资源...

    二维数组的堆排序

    二维数组的堆排序是计算机科学中的一个重要概念,特别是在数据结构和算法的学习中。在Java编程中,处理二维数组并对其进行排序是一项常见的任务。本篇文章将深入探讨如何利用堆排序算法对二维数组进行排序,以及如何...

    将二维数组进行线性插值

    在本场景中,我们处理的是一个二维数组,这种数据结构通常用来存储矩阵或图像数据。以下是关于二维数组和线性插值的详细知识: 二维数组在计算机科学中,是一个多维数据结构,它由一串连续的内存位置组成,这些位置...

Global site tag (gtag.js) - Google Analytics