Java算法分析2—————几种排序&汉诺塔算法

一:插入排序

/*
 * 插入排序
 */
/*
 * 原序列 [12] 15 9 20 6 31 24
 * 第0趟 [12 15] 9 20 6 31 24
 * 第1趟 [9 12 15] 20 6 31 24
 * 第2趟 [9 12 15 20] 6 31 24
 * 第3趟 [6 9 12 15 20] 31 24
 * n个数,一共需要多少趟?n个数,n-1趟
 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列
 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 ...
 * 第i趟,把i+1位置的数,和i位置之前的数进行比较,按大小顺序排列。
 */
public class sort01 {
	public static void main(String[] args) {
		int[] num = { 3, 4, 1, 6, 3 };
		for (int i = 0; i < num.length - 1; i++) {
			for (int j = 0; j < i + 1; j++) { // 第i趟...将i+1位置的数与i+1位置之前的数进行比较
				// 判断当前数num[j]与num[i+1]进行比较
				if (num[i + 1] < num[j]) {
					int temp = num[i + 1];
					num[i + 1] = num[j];
					num[j] = temp;
				}
			}
		}
		for (int i = 0; i <= num.length - 1; i++) {
			System.out.println("排序完成后:" + num[i]);
		}
	}
}

二:选择排序

/*
 * 选择排序
 */
/*
 * 以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
 * 初始序列:{ 49 27 65 97 76 12 38 }
 * 第1趟:12与49交换:12 { 27 65 97 76 49 38 }
 * 第2趟:27不动 :12 27 { 65 97 76 49 38 }
 * 第3趟:65与38交换:12 27 38 { 97 76 49 65 }
 * 第4趟:97与49交换:12 27 38 49 { 76 97 65 }
 * 第5趟:76与65交换:12 27 38 49 65 { 97 76 }
 * 第6趟:97与76交换:12 27 38 49 65 76 97
 */
public class sort03 {
	public static void main(String[] args) {
		int[] num = { 2, 5, 3, 23, 6, 9, 66 };
		for (int i = 0; i <= num.length - 1; i++) { // 比较N轮
			// 找最小
			int min = num[i]; // 每轮使第一个数最小,依次用后面的比
			for (int j = i + 1; j <= num.length - 1; j++) {
				if (min > num[j]) {
					min = num[j];
				}
			}
			// 判断下最小的数出现在什么位置
			int j;
			for (j = i; j <= num.length - 1; j++) {
				if (num[j] == min) {
					break;
				}
			}
			// j位置为最小值
			// 交换位置
			if (j > i) {
				int temp = num[j];
				num[j] = num[i];
				num[i] = temp;
			}

		}
		// 打印
		for (int i = 0; i <= num.length - 1; i++) {
			System.out.println(num[i]);
		}

	}
}

三:冒泡排序

/*
 * 冒泡排序
 */
public class sort04 {
	static void sort() {
		int[] num = { 2, 1, 3, 5, 4, 7, 2 };
		for (int i = 0; i < num.length - 1; i++) { // 比较n-1轮
			for (int j = 0; j < num.length - i - 1; j++) {
				if (num[j] > num[j + 1]) {
					int temp = num[j];
					num[j] = num[j + 1];
					num[j + 1] = temp;
				}
			}
		}
		// 打印
		for (int i = 0; i <= num.length - 1; i++) {
			System.out.println(num[i]);
		}
	}

	public static void main(String[] args) {
		sort();
	}
}

四:汉诺塔算法

/*
 * 汉诺塔 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
 * 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
 * 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
 * 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
 *  A柱 B柱 C柱
 *  64个盘子,由小到大叠放在A柱上, 现在,要求把这64个盘子,从A柱移动到C柱
 *  要求:移动过程中,大盘子不能覆盖小盘子,可以借助B柱。
 *  1个盘子:从A端到C
 *  2个盘子,把上的小盘子挪到B柱临时存放,下面的大盘子移动到C柱,再将B柱上临时存放的小盘子,移动到C柱。
 *  3个盘子: 更多盘子怎么办?
 *  n个盘子
 *  a.先把上面的n-1个盘子 从A,借助C,移动到B
 *  b.把下面一个盘子,从A移动到C
 *  c.把B柱上的n-1个盘子从B借助A,移动到C 2的64次方-1 次
 */
public class sort02 {
	static void hanoi(int n, String src, String mid, String dest) {
		if (n == 1) {
			System.out.println(src + "-->" + dest);
		} else {
			hanoi(n - 1, src, dest, mid);
			hanoi(1, src, null, dest);
			hanoi(n - 1, mid, src, dest);
		}
	}

	public static void main(String[] args) {
		hanoi(3, "A", "B", "C");
	}

}
时间: 2024-12-25 00:16:14

Java算法分析2—————几种排序&汉诺塔算法的相关文章

Java编程用栈来求解汉诺塔问题的代码实例(非递归)_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上

汉诺塔算法演示1.0

工作之余闲来无聊,于是就有了用JS来实现算法演示的想法,很久以前用JS实现过选择排序,不过源程序找不到了! 汉诺塔的递归算法: void move(int n,char a,char b,char c) { if(n==1) printf("\t%c->%c\n",a,c); //当n只有1个的时候直接从a移动到c else { move(n-1,a,c,b); //第n-1个要从a通过c移动到b printf("\t%c->%c\n",a,c); mo

基于Python的汉诺塔算法

首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3):    if(n == 1):        print('move:',x1,'-->',x3)        return    hanoti(n-1,x1,x3,x2)    print('move:',x1,'-->',x3)    hanoti(n-1,x2,x1,x3) hanoti(3,'A','B','C') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

《算法四》(二分排序+汉诺塔问题)

二分查找:有序数组按照二分方式来查找数据 递归方法: //递归方式: int mid = l + (r-l)/2;//中间 if(l==r) return -1;//没有找到的情况 if(finddata==a[mid]) return mid; if(finddata>a[mid]) return half_find(a, mid+1, r, finddata); if(finddata<a[mid]) return half_find(a, l, mid, finddata); 非递归方法

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

汉诺塔算法之求解最佳步数

写的不好,但是请尊重版权,转载请注明出处: http://www.cnblogs.com/xiaovw/ 何为汉诺塔? 答:汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 关于汉诺塔的经典问题: 有三根相邻的柱子,标号为A,

汉诺塔算法

首先介绍下汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 算法思想: 主要是递归方法的使用:假设有A.B.C三根柱子,用户输入盘子的数目,开始的时候盘子全部在A上,通过B将所有的盘子移动到C上. 盘子数目为n 1.当n=1时,直接将A上的盘子移到C上

汉诺塔算法的理解

当盘子数为两个时,移动图如下: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A B 2 2 A C 3 1 B C 当盘子数为3个时: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A C 2 2 A B 3 1 C B 4 3 A C 5 1 B A 6 2 B C 7 1 A C 从以上移动移动规律可以总结出,当步骤序号和盘子数目相同时,就是把最底下的盘子从A移动到C,其它的步骤都是对等的,规律如下: 中间以上动作是:源柱子(A)不变,目标柱子为C,辅助柱子为B进行移动