排序算法
1. 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
2. 选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
3. 冒泡排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
4. 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。
void bubbleSort(int[] numlist) // 冒泡排序算法
{
int temp;
for(int j=1;j<numlist.length;j++)
for(int i=0;i<numlist.length-j;i++)
if(numlist>numlist[i+1])
{
temp = numlist[i+1];
numlist[i+1] = numlist;
numlist = temp;
}
}
vo id selectionSort (int[] numlist) //选择排序算法
{
int temp;
for(int i=0;i<numlist.length-1;i++)
for(int j=i+1;j<numlist.length;j++)
if(numlist>numlist[j])
{
temp = numlist[j];
numlist[j] = numlist;
numlist = temp;
}
}
vo id insertSort (int[] numlist) //插入排序算法
{
int temp,in,out;
for(out=1;out<numlist.length;out++)
{
temp=numlist[out];
in=out;
while(in>0 && numlist[in-1]>=temp)
{
numlist[in]=numlist[in-1];
--in;
}
numlist[in]=temp;
}
搜索算法
1.题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不
同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
2.基本思路: 1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六
个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。2 显然这个结果集还未达到题目的要求。
从以下几个方面考虑:1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。2. 不能有重复:考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果 3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。采用二维数组定义图结构,最后的代码是:
3.import java.util.Iterator;
4.import java.util.TreeSet;
5.
6.public class TestQuestion {
7.
8.private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
9.private int n = b.length;
10.private boolean[] visited = new boolean[n];
11.private int[][] a = new int[n][n];
12.private String result = "";
13.private TreeSet set = new TreeSet();
14.
15.public static void main(String[] args) {
17.}
18.
19.private void start() {
20.
21.// Initial the map a[][]
22.for (int i = 0; i < n; i++) {
23.for (int j = 0; j < n; j++) {
24.if (i == j) {
25.a[i][j] = 0;
26.} else {
27.a[i][j] = 1;
28.}
29.}
30.}
31.
32.// 3 and 5 can not be the neighbor.
33.a[3][5] = 0;
34.a[5][3] = 0;
35.
36.// Begin to depth search.
37.for (int i = 0; i < n; i++) {
38.this.depthFirstSearch(i);
39.}
40.
41.// Print result treeset.
42.Iterator it = set.iterator();
43.while (it.hasNext()) {
44.String string = (String) it.next();
45.// "4" can not be the third position.
46.if (string.indexOf("4") != 2) {
47.System.out.println(string);
48.}
49.}
50.}
51.
52.private void depthFirstSearch(int startIndex) {
53.visited[startIndex] = true;
55.if (result.length() == n) {
56.// Filt the duplicate value.
57.set.add(result);
58.}
59.for(int j = 0; j < n; j++) {
60.if (a[startIndex][j] == 1 && visited[j] == false) {
61.depthFirstSearch(j);
62.} else {
64.}
65.}
66.
67.// restore the result value and visited value after listing a node.
69.visited[startIndex] = false;
70.}
71.}
2.一个n×n(1<=n<=100)的国际象棋棋盘上放置n个皇后,使其不能相互攻击,即任何两个皇后都不能处在棋盘的同一行、同一列、同一斜线上,试问共有多少种摆法?
3.枚举法(通常也称穷举法)是指在一个有穷的可能的解的集合中,枚举出集合中的每一个元素,用题目给定的约束条件去判断其是否符合条件,若满足条件,则该元素即为整个问题的解;否则就不是问题的解。
【枚举算法解题必须满足下列条件】
⑴可预先确定解元素的个数n,且问题的规模不是很大;
⑵对于每个解变量A1,A2,…An的可能值必须为一个连续的值域。
java培训怎么学【枚举算法实现】
通常使用嵌套的FOR结构循环语句枚举每个变量的取值,在最里层的循环中判断是否满足给定的条件,若满足则输出一个解。
【枚举算法优化】
⑴减少枚举的变量。
在使用枚举法之前,先考虑一下解元素之间的关联,将那些能由已枚举解元素推算出来的变量直接用计算表达式代替。
⑵减少枚举变量的值域。
通过各枚举变量间的数学关系定义解元素的值域,在保证不遗漏的情况下越小越好。
⑶分解约束条件。
将拆分的约束条件嵌套在相应的循环体间,即尽可能根据约束条件减少变量个数和缩小值域。习题:
练习1】将1~9这九个数字填入九个空格中。每一横行的三个数字组成一个三位数。如果要使第二行的三位数是第一行的两倍,第三行的三位数是第一行的三倍,应这样填数。如下图所示。
【练习2】一根长29cm的尺子,只允许在上面刻七个刻度,要能用它量出1~29cm的各种长度。试问这
刻度应该怎么选择?
【练习3】有4个学生,上地理课时提出我国四大淡水湖的排序如下。
甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三;
乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三;
丙:红泽湖最小,洞庭湖第三;
丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三;
对于各个湖泊应处的地位,每个人只说对了一个。
根据以上情况,编一个程序,让计算机判断各个湖泊应处在第几位。
5.深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的结点,如果它还有以此为起点而未搜过的边,就沿着边继续搜索下去。当结点v的所有边都已被探寻过,搜索将回溯到发现结点v有那条边的始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个过程反复进行直到所有结点都被发现为止
6. 宽度优先搜索算法(又称广度优先搜索算法)是最简单的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijksta单源最短路径算法和Prim最小生成树算法都采用了与宽度优先搜索类似的思想。
宽度优先搜索的核心思想是:从初始结点开始,应用算符生成第一层结点,检查目标结点是否在这些后继结点中,若没有,再用产生式规则将所有第一层的结点逐一扩展,得到第二层结点,并逐一检查第二层结点中是否包含目标结点。若没有,再用算符逐一扩展第二层所有结点……,如此依次扩展,直到发现目标结点为止。
【习题】有两个无刻度的量杯A和B,其容积分别为m升和n升(m>n),现在允许用量杯从水缸里取水或将水倒回水缸里,而且两个量杯中的水也可以相互倾倒,试设计计算机程序求出在m 升的量杯中准确量得k升(<N
k<n<m)所需的最少操作步数。(每一个取水或倒水都算一个操作步数)
【习题】【八数码问题】
九宫格中有8个数码,其中只有一个空,规则是只能把一个数码移动到空的格子中,要求从一个初始状态移动到一个目标状态所要花费的最少步数。如下图
【算法分析】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论