全排序的两种想法

 字典序全排序:

1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 public class Cao41 {
 4     /**
 5      * @param 第一行输入个数N,第二行输入序列1-9,
 6      * 输出字典序排列         具体做法如下:         首先要将数组a从小到大排序,输出第一个排序,然后进入循环         先用getindex方法找到最靠后的,后面有比啊a[index]大的index,当index不存在设index=-1,结束循环。         然后从 index到end找出比a[index]大的数中最小的啊a[min].         将a[index]与a[min]交换,再将数组a从index到end排序,打印数组
 7      */
 8     public static void getAllOrder(int[] a,int N){
 9         int end=N-1;
10         int index=end;
11         sort(a,0,N-1);
12         System.out.println(Arrays.toString(a));
13         do{
14             index=getIndex(a,end);
15             if(index==-1)break;
16             int min=getMin(a,index,end);
17             swap(a,index,min);
18             sort(a,index+1,end);
19             System.out.println(Arrays.toString(a));
20         }while(index!=-1);
21     }
22     /**
23      * @return 找出数组a中后续数字有比a[index]大的数字,且最靠后的index
24      */
25     public static int getIndex(int[] a,int end){
26         for(int i=end-1;i>=0;i--){
27             if(a[i]<a[i+1]) return i;
28         }
29         return -1;
30     }
31     /**
32      * @param 数组a从index开始到end为止找出最小的且比a[index]大的数
33      */
34     public static int getMin(int[] a,int index,int end){
35         if(end==index+1)return end;
36         int minindex=index+1;
37         for(int i=index+1;i<=end;i++){
38             if(a[index]<a[i]&&a[i]<a[minindex])minindex=i;
39         }
40         return minindex;
41     }
42
43     /**
44      * 对数组a从begin到end进行冒泡排序
45      */
46     public static void sort(int[] a,int begin,int end){
47         if(begin==end)return;
48         for(int i=begin;i<=end;i++)
49         {
50             for(int j=i;j<=end;j++){
51                 if(a[j]<a[i])swap(a,i,j);
52             }
53         }
54     }
55
56     /**
57      * @将数组 a的a[from]与a[to]交换
58      */
59     public static void swap(int[] a,int from,int to){
60         int temp=a[from];
61         a[from]=a[to];
62         a[to]=temp;
63     }
64
65
66     public static void main(String[] args) {
67         Scanner cin=new Scanner(System.in);
68         int N=cin.nextInt();
69         int[] a=new int[N];
70         for(int i=0;i<N;i++){
71             a[i]=cin.nextInt();
72         }
73
74         getAllOrder(a,N);
75     }
76 }

   全排列:模拟全排列,依次取各位的数,每取完依次输出一次 具体操作就是n中取1,n-1中取1......注意每次操作完要回溯还原现场
 1 public class Cao13 {
 2
 3     /**
 4      * @输出数组全排列
 5      */
 6     static int j=0;
 7     static String s="";
 8     public static void mypermutation(int[] a,int begin,int end){
 9         if(begin==end)
10         {
11             String temp="";
12             for(int i=0;i<a.length;i++)
13             {
14                 temp+=a[i];
15             }
16             if(!s.contains(temp)){
17                 System.out.println(j+"行:"+temp);
18                 s+=temp+" ";
19             j++;
20             }
21         }
22         else{
23             for(int i=begin;i<=end;i++)
24            {
25             swap(a,begin,i);
26             mypermutation(a,begin+1,end);
27             swap(a,i,begin);
28            }
29         }
30
31     }
32     public static void swap(int[] a,int from,int to){
33         int temp=a[from];
34         a[from]=a[to];
35         a[to]=temp;
36     }
37
38     public static void main(String[] args) {
39         int[] b={1,2,2};
40         mypermutation(b,0,2);
41     }
42 }
				
时间: 2024-11-05 23:32:37

全排序的两种想法的相关文章

ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

1 /* 2 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 3 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 4 出现了回路!用这种方法必须将重边去除掉! 5 6 所以推荐用dfs方式进行判断!这种方式还是比较直观的! 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<algorith

实现对多维数组按照某个键值排序的两种方法(array_multisort和array_sort)

实现对多维数组按照某个键值排序的两种解决方法(array_multisort和array_sort): 第一种:array_multisort()函数对多个数组或多维数组进行排序. //对数组$hotcat按照count键值大小降序进行排序: $hotcat =array( array('1501'=>array('catid'=>'1546','catname'=>'续梦PHP 一级','count'=>'588')), array('1501'=>array('catid

数据结构:图论:拓扑排序! 两种方法!

拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较! (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前. 数据结构中进行拓扑排序的方法: 方法一: (1)在有向图中选一个没有前驱的顶点且输出之! (2)从图中删除该顶点和所有以它为尾的弧. (3)重复上述两部,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止.后一种情况说明有向图中存在环! 代码: #

有向无环图(DAG)拓扑排序的两种方法

如下图的DAG: 第一种: (1)从AOV网中选择一个没有前驱的顶点并且输出它: (2)从AOV网中删除该顶点,并且上去所有该顶点为尾的弧: (3)重复上述两步,直到全部顶点都被输出,或者AOV网中不存在没有前驱的顶点. 第二种: 使用深度优先搜索(DFS),并标记每一个节点的第一次访问(pre)和最后一次访问时间(post),最后post的逆序就是DAG的拓扑排序,其实也是节点在进行DFS搜索时,出栈的逆序就是拓扑排序. 拓扑序列的结果有: (1) c++,高等数学,离散数学,数据结构,概率论

算法整理(二)---高速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下高速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).由于用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法.基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的很清楚了,分治法+挖坑法,我就不多说了.就是以某个数为參照,使得左边的都小于他,右边的数都大于他.然后对他的左右两个区间採取相同的方法进行递归. 就其总体

java List递归排序,无序的列表按照父级关系进行排序(两种排序类型)

当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树结构进行排序 排序前:122,13,121,1,131,12,132...无序的[TestSort [id=122, name=三级b, parentid=12], TestSort [id=13, name=二级b, parentid=1], TestSort [id=121, name=三级a,

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

python list排序的两种方法及实例讲解

对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Python实例: >>> list = [2,5,8,9,3] >>> list [2,5,8,9,3] >>> list.sort() >>> list [2, 3, 5, 8, 9] 方法2.用序列类型函数sorted(list)进行排

Collections.sort方法对list排序的两种方式

Collections.sort( )分为两部分,一部分为排序规则,一部分为排序算法 . 规则用来判断对象,算法则考虑如何进行排序 对于自定义对象,sort()不知道规则,所以无法比较,这种情况下一定要定义排序规则.方式有两种: 第一种,java.lang下面的一个接口:Comparable.可以让自定义对象实现一个Comparable接口,这个接口只有一个方法comparableTo(Object o) 其规则是当前对象与o对象进行比较,返回一个int值,系统根据此值进行排序. 如当前对象>o