《算法四》(二分排序+汉诺塔问题)
Posted whgy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《算法四》(二分排序+汉诺塔问题)相关的知识,希望对你有一定的参考价值。
二分查找:有序数组按照二分方式来查找数据
递归方法:
//递归方式: 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; }
以上是关于《算法四》(二分排序+汉诺塔问题)的主要内容,如果未能解决你的问题,请参考以下文章
算法-基础和查找-1.汉诺塔/2.顺序查找/3.二分查找/4.顺序查找和二分查找的比较