折半查找法的两种实现

 

折半查找法的两种实现

折半查找法的两种实现

折半查找法:

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

1)     待查找数据值与中间元素值正好相等,则返回中间元素值的索引。

2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4)     如果最后找不到相等的值,则返回错误提示信息。

 

按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为

log2(n+1)-1

  1. int main(int argc, const char * argv[])

    {

        

        int searchArray[100];//要查找的数组

        for (int i = 0; i < 100; i++) {

            searchArray[i] = i + 1;

        }

        

        int index = 0;//要查找的数所在的索引

        int searchNum = 45;//需要查找的数

        //循环查找

        int searchIndex1(int array[],int const searchNum,int maxIndex,int minIndex);

        //递归查找

        int searchIndex2(int array[],int const searchNum,int maxIndex,int minIndex);

        

        index = searchIndex1(searchArray, searchNum, 99, 0);

        index = searchIndex2(searchArray, searchNum, 99, 0);

        printf("index = %d\n",index);

        /*折半查找的思想是:

            将要查找数searchNum和数组中间的进行比较,如果searchNum < searchArray[midIndex],让最大索引maxIndex = midIndex -  1,如果searchNum > searchArray[midIndex]让最小索引minIndex = midIndex + 1,最终找到要查找的数。

         循环查找:

            while (minIndex <= maxIndex)作为循环判断,直到找到需要查找的数为止

         递归查找:

            递归是在searchNum != searchArray[midIndex]的时候调用自身,一直到找到要查找的数为止*/

        return 0;

    }

    int searchIndex1(int searchArray[],int const searchNum,int maxIndex,int minIndex)

    {

        if (minIndex > maxIndex) {

            return -1;

        }

        while (minIndex <= maxIndex) {

            

           int midIndex= (maxIndex + minIndex) / 2;

            if (searchNum == searchArray[midIndex]) {

                printf("midIndex = %d\n",midIndex);

                return midIndex;

            }

            else if (searchNum < searchArray[midIndex])

            {

                maxIndex = midIndex -  1;

            }

            else if (searchNum > searchArray[midIndex])

            {

                minIndex = midIndex + 1;

            }

        }

        return -1;

    }

    int searchIndex2(int searchArray[],int const searchNum,int maxIndex,int minIndex)

    {

        if (minIndex > maxIndex) {

            return -1;

        }

        int midIndex = (maxIndex + minIndex) / 2;

        if (searchNum == searchArray[midIndex]) {

            printf("midIndex = %d\n",midIndex);

            return midIndex;

        }

        else if (searchNum < searchArray[midIndex])

        {

            return searchIndex2(searchArray, searchNum, midIndex -  1, minIndex);

        }

        else if (searchNum > searchArray[midIndex])

        {

            return searchIndex2(searchArray, searchNum, maxIndex, midIndex + 1);

        }

        return -1;

    }

posted on 2013-11-23 14:13  IOS开发者  阅读(821)  评论(0编辑  收藏  举报