zoukankan      html  css  js  c++  java
  • 《算法四》(二分排序+汉诺塔问题)

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

    //递归方式: 
    	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 
    ", 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("
    ");
    } 
    
    
    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;
    }
  • 相关阅读:
    “Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”
    【问底】夏俊:深入站点服务端技术(一)——站点并发的问题
    java反射调用方法
    linux 文件操作系统调用
    64位win7中使用vs2013为python3.4安装pycrypto-2.6.1插件报Unable to find vcvarsall.bat异常解决方式
    ViewPager+RadioGroup实现标题栏切换,Fragment切换
    Android View系统解析(下)
    高速学会Mac上托管代码到github(具体解释)
    linux程序设计——多线程(第十二章)
    使用工作流更新子记录
  • 原文地址:https://www.cnblogs.com/Whgy/p/12287014.html
Copyright © 2011-2022 走看看