黑马程序员技术交流社区
标题:
Java问题求解
[打印本页]
作者:
郑亚洲
时间:
2011-7-30 11:05
标题:
Java问题求解
如果有一个3个数,{1,2,3},那么排序有
123,132,213,231,312,321六种
现在编写代码罗列出6个数{1,2,3,4,5,6}的排序
注意:编写的程序不要求求出几种排序方法,主要是罗列出各种排序方法,如142365,123456
鉴于6个数的排序方法种类较多,那就改成5个数吧,4个数也可以,主要是看编程的方法。
[
本帖最后由 郑亚洲 于 2011-07-30 11:29 编辑
]
作者:
匿名
时间:
2011-7-30 11:31
标题:
回复 楼主 的帖子
看看这个 行不[code]import java.util.Arrays;
public class pailie {
//测试
public static void main(String[] args) {
Integer[] arr = {1,2,3,4,5,6};
// Object[] arr = {'a','b','c'};
sortAll(arr,0);
}
//一个泛型数组的空杯交换
public static <T> void temp(T[] arr,int index1,int index2){
T temp;
temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
/**
* 迭代递归
* @param <T> 泛型
* @param arr 泛型数组
* @param flag 标识符,用以标识从第几个元素开始迭代递归,元素从0开始
*/
public static <T> void sortAll(T[] arr,int flag){
if(flag == arr.length){
System.out.println(Arrays.toString(arr));
}else{
for (int i = flag; i < arr.length; i++) {
temp(arr, i, flag);//迭代之前的空杯交换
sortAll(arr, flag+1);//递归,将当前的标记自增
temp(arr, i, flag);//迭代之后恢复原貌
}
}
}
} [/code]
作者:
匿名
时间:
2011-7-30 11:32
思想:
1、如果数组元素的长度为1的话(1),那么组合方式就是1中----(1)
2、如果数组元素的长度为2的书(1 , 2) ,那么组合的方式就是2种----(1 ,2 ) , (2 , 1)
3、如果数组元素的长度为3的话(1 , 2 ,3),那么组合的方式就是6种---(1 , 2 ,3),(1 , 3 ,2),(3 , 1 ,2),(3 , 2 ,1),(2 , 3 ,1),(2 , 1 ,3),
规律:
1、当数组长度为1时,返回的组合方式只有1种,就是它本身
2、当新加一个数组元素时,这个[color=Red]新元素就会与原来的每一种组合方式中的每个数组元素发成关系[/color],表现为:新数组元素在原来的每一种组合方式中的各个位置分别插入一次,这样就出现更多的组合方式,而这所有的组合方式的合集,就是加入新元素后的新数组的所有组合方式,
3、比如只有一个数组元素(1),我们添加一个数组元素2;[color=Red]在数组元素1之前插进去(2 , 1) ,在数组元素之后插进去(1 , 2)[/color]形成的新数组就是所有的组合
4、如果我们在上面两个元素的数组重在插入一个3(1 , 2),(2 , 1)
就要分别在(1 , 2)和(2 , 1)里面都要插入,
第一种在(1 , 2)插入,将3分别插入数组元素的前面、中间和后面得到------(3 , 1 ,2)(1 , 3 ,2),(1 , 2 ,3)
第二种在(2 , 1)插入,讲3分别插入数组元素的前面、中间和后面得到------(3 , 2 ,1),(2 , 3 ,1),(2 , 1 ,3)
这样也就是三个元素的组合方式了,以此类推:
下面用方法来实现,主函数的测试各位可自己写[code=java]public static List<int[]> GetDataArray(int[] data)
{
List<int[]> list = new List<int[]> ();
if(data ==null)
return list;
if (data.Length == 1) //如果长度为1,那么返回它的组合方式,即它本身。
{
list.Add(data);
}
else //否则,引入新的数组元素,并插入到原有的组合方式的各个位置,形成新的组合方式。
{
int[] dataSub = new int[data.Length - 1];
for (int i = 0; i < data.Length - 1; i++)
{
dataSub[i] = data[i + 1];
}
List<int[]> listOld = GetDataArray(dataSub); //获取原有的组合方式
int newNum = data[0];
int[] newData = null;
for (int i = 0; i < listOld.Count; i++) //遍历每一种原有的组合方式
{
for (int j = 0; j <= listOld[i].Length; j++) //遍历组合方式中的每个位置
{
newData = new int[listOld[i].Length + 1];
newData[j] = newNum;
int currentIndex = 0;
for (int n = 0; n < listOld[i].Length; n++)
{
if (currentIndex == j)
currentIndex++;
newData[currentIndex] = listOld[i][n];
currentIndex++;
}
list.Add(newData);
}
}
}
return list;
}[/code]
作者:
匿名
时间:
2011-7-30 20:32
李龙,季春顶你们
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2