CodeKata02 : Karate chop 折半查找
来源:互联网 发布:淘宝爆款打造方案 编辑:程序博客网 时间:2024/05/16 06:52
折半查找
折半查找(binary chop):在一个已排序的数组中找到某个值的位置。
练习方法:使用不同的技术实现,直到有5种完全不同的实现。比如迭代,递归,或使用函数传递部分数组来实现(functional style passing array slices around)。
目标
当编写每个算法时,记录你遇到的错误。经过一周,看是否这些错误的出现的频
率在下降。(当你改用不同技术编码时,是否能从中学到什么?)总结各个技术的长处,哪个更适合用作一个产品的编码?哪个使用起来最有乐趣?哪个执行起来最困难?每个问题,都问why。
- 找到5个方法实现折半查找是相当困难的,你是如何找到这些方法的(What techniques did you use to fire those “off the wall” neurons? 译作:激活这些古怪的神经元?)
说明
写一个折半查找函数,输入参数为已排序的数组和要查找的Integer值。返回值为数组序号,或者-1表示查找失败。假设数组小于100,000个元素。
int chop(int,arrayOfInt)
练习1:迭代法
迭代:将输出作为输入,再次进行处理。
private static int chop(int search, int[] array) { int startIndex = 0; int endIndex = array.Length-1; int midIndex = 0; do {//迭代法 midIndex = startIndex + (endIndex - startIndex) / 2; if (search == array[midIndex]) { return midIndex; }else if(search > array[midIndex]) { startIndex = midIndex+1; }else if (search < array[midIndex]) { endIndex = midIndex-1; } } while (startIndex <= endIndex); return -1; }
练习2:递归法
递归:自己调用自己,自己包含自己。
private static int chopRecursion(int search, int[] array,int startIndex, int endIndex) { int midIndex = startIndex + (endIndex - startIndex) / 2; if (startIndex <= endIndex) { if (search == array[midIndex]) { return midIndex; } else if (search > array[midIndex]) { startIndex = midIndex + 1; } else if (search < array[midIndex]) { endIndex = midIndex - 1; } //自己调用自己,递归 return chopRecursion(search, array, startIndex, endIndex); } else { return -1; } }
练习3:
使用函数传递部分数组实现折半查找
private static int chop3(int search, int[] array,int lastIndex) { int startIndex = 0; int endIndex = array.Length - 1; int midIndex = 0; int[] newArray; const int INT_SIZE = 4; if (endIndex>=0) {//递归法 + 参数为 部分数组 midIndex = endIndex / 2; if (search == array[midIndex]) { return lastIndex + midIndex; } else if (search > array[midIndex]) { startIndex= midIndex + 1; lastIndex += startIndex; newArray = new int[endIndex- startIndex + 1]; Buffer.BlockCopy(array, startIndex * INT_SIZE, newArray, 0, (endIndex - startIndex + 1) * INT_SIZE); return chop3(search, newArray, lastIndex); } else if (search < array[midIndex]) { endIndex = midIndex - 1; newArray = new int[endIndex+1]; Buffer.BlockCopy(array, 0, newArray, 0, (endIndex+1) * INT_SIZE); return chop3(search, newArray, lastIndex); } } return -1; }
阅读全文
0 0
- CodeKata02 : Karate chop 折半查找
- code kata NO.2 : Karate Chop
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- C语言——初识数组
- ubuntu14.04安装opencv3.3.0-dev+opencv_contrib
- 中缀表达式转换为前缀后缀表达式的算法流程图
- Redis应用场景
- 为什么SQL正在击败NoSQL,这对未来的数据意味着什么
- CodeKata02 : Karate chop 折半查找
- [BZOJ]1123 [POI2008]BLO 割点
- Vuex简单入门
- c++--简单易懂的排序算法和二叉树递归总结
- 【JZOJ 5403】 Lost My Music
- 接口测试用例设计
- Java 通过URL地址下载文本内容到本地文件中
- HDU 2844Coins(涉及包含三种背包问题)
- 我的“View的事件体系”知识点总结