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

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

//递归方式: 
	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;
}
原文地址:https://www.cnblogs.com/Whgy/p/12287014.html