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;        }
原创粉丝点击