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

二分查找:有序数组按照二分方式来查找数据
递归方法:

//递归方式:
	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);

非递归方法:

//非递归方式:
	int mid;
	int left = l;
	int right = r;
	while(left < right){
		mid = left + (right-left)/2;
		if(finddata == a[mid]) return mid;
		if(finddata > a[mid]){
			left = mid+1;
		}else{
			right = mid;
		}
	}
	return -1;//没有找到的情况,此时left==right 

递归练习之汉诺塔问题:

#include<iostream>
#include<vector>
#include<string.h>
int count=0;

void han_nuo(int num, char A, char B, char C){
	if(num<1) return;//num不符合实际的情况 

	han_nuo(num-1, A, C, B);
	printf("%c-->%c \n", A, C);
	han_nuo(num-1, B, A, C);

	count++;
} 

int main(){
	han_nuo(10, ‘a‘, ‘b‘, ‘c‘);
	printf("一共移动%d次", count);
	return 0;
}

二分查找与归并排序总结:
都是分治思想
二分:每次排除一半
归并:拆分成为2个,递归的进行拆分直到都成为有序数组
然后合并有序数组————>排序成功

代码演示:

#include<iostream>
#include<vector>
#include<string.h>
#define NUM 10

void print_art(int* a, int len){
	for(int i=0; i<len; i++){
		printf("%d ", a[i]);
	}
	printf("\n");
} 

int half_find(int* a, int l, int r, int finddata){
	/*
	递归方式:
	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);
	*/

	//非递归方式:
	int mid;
	int left = l;
	int right = r;
	while(left < right){
		mid = left + (right-left)/2;
		if(finddata == a[mid]) return mid;
		if(finddata > a[mid]){
			left = mid+1;
		}else{
			right = mid;
		}
	}
	return -1;//没有找到的情况,此时left==right
}

//二分查找
int halffind(int* a, int len, int finddata){
    return half_find(a, 0, len-1, finddata);
} 

int main(){
	int a[NUM] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int finddata = 66;
	int index = halffind(a, NUM, finddata);
	printf("%d下标:%d",finddata,index);
	return 0;
}

原文地址:https://www.cnblogs.com/Whgy/p/12287014.html

时间: 2024-10-10 17:51:42

《算法四》(二分排序+汉诺塔问题)的相关文章

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

一:插入排序 /* * 插入排序 */ /* * 原序列 [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位置之前的数进行比较,按大小顺序排列 .

水题 第四站 HDU 汉诺塔VII

先来回忆一下汉诺塔 A,B,C,三个塔将A塔上的n块砖转移到C塔,首先将(n-1)块砖转移到B塔,将第n块砖转移到C塔,再将B塔上的(n-1)块砖转移到C塔,所以 函数为借助B塔,将A塔的砖转移到C塔, 首先是借助C塔,将A塔的砖转移到B塔, 然后是借助A塔,将B塔的砖转移到C塔. 附上网上的代码,有助于理解,出处 http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/ 1 #include <iostream> 2 #includ

Python算法 - 递归精解 - 汉诺塔问题

汉诺塔问题 题意 将A 柱子上的块转移到 C 上 条件1  -  每次只能转移一块 条件2  -  大块不能压小快 解析 概念原理 冰箱装大象问题 : 1. 打开冰箱 2. 放入大象 3. 关上冰箱 类比在 任何一个块 n 来说: 1. 把上面的块都移动好 2. n 块移动过去 3. 之前上面的块在放在 n 块上面 简化问题, 考虑 123块的移动, 可以考虑成我想移动 3 . 必然要移动12 同理 我想移动 2, 必然要移动 1 , 即关系为 f(3) ---> f(2) ---> f(1)

【算法与数据结构】汉诺塔问题Java实现

思路:递归 [代码] 1 public class Main { 2 public static void hanoi(int n, int x, int y, int z) { 3 if (n == 1) { 4 System.out.print(x + "----->" + z); 5 }else { 6 hanoi(n - 1, x, z, y);//把前面n-1个移动到y上 7 System.out.print(x + "----->" + y)

算法-基础和查找-1.汉诺塔/2.顺序查找/3.二分查找/4.顺序查找和二分查找的比较

1.汉诺塔: 如下图所示,需要将A柱子中的所有圆盘按照从小到大的顺序移动到C柱子上,并且在移动过程中大圆盘不能在小圆盘上面 分析问题:最终希望呈现的结果是将A柱子上的盘子全部按照从小到大的顺序移动到C柱子上 1.n个盘子,将n-1视为一个整体 2.将n-1个盘子视为一个盘子从a经过c移动到b 3.将n从a移动到c 4.将n-1个盘子从b经过a移动到c 5.结束条件:n>0 代码如下: 1 def hanoi(n, a, b, c): 2 if n > 0: 3 hanoi(n-1, a, c,

hd 1207(四汉诺塔)

三个汉诺塔算法 f(n)=2^n-1 两个思路大同小异 Frame算法 在1941年,一位名叫J. S. Frame的人在<美国数学月刊>上提出了一种解决四柱汉诺塔问题的算法,这是人们熟知的Frame算法: (1)用4柱汉诺塔算法把A柱上部分的n- r个碟子通过C柱和D柱移到B柱上[F( n- r )步]. (2)用3柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上[2^r-1步]. (3)用4柱汉诺塔算法把B柱上的n-r个碟子通过A柱和C柱移到D柱上[F(n-r)步]. (4)依据上

nyoj 1078 汉诺塔(四)[二分图 || 规律 || 暴力 || 贪心]

题目:nyoj 1078 汉诺塔(四) 分析:做这个题目的时候是在图论的题目里面看到的,到时读了题目推了一下,发现好像有点规律,试了一下果然过了. 后来看了一下数据,才50,那么试了一下模拟,也过了. 好像zoj有一道题目卡模拟,模拟的时候必须贪心一下才能过 这道题出题人的意图在于考大家的:二分图最小路径覆盖. 把每一个球看做一个点,然后如果两个和为平方数的话就给这两个点之间连接一条边,然后用一个特殊的匹配算法,类似于匈牙利算法,但是每次找匹配的时候加入一条边上连接的有匹配的话就不能匹配,最后求

汉诺塔算法演示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') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首