数组 有序数组 二分查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a15998126054/article/details/83184035

路越走越多,可以坚持,但别固执

有序数组,顾名思义,按顺序排列的数组。思考下,插入可能再想之前那样插在第一个空位吗?查找的话能比之前的N/2更少步吗?删除就不比较了,都需要补洞,没太大差别。

对于前面2个问题,先给出定论,插入肯定不是插在第一个空位了,查找能比之前的快很多。

先讲关于查找的问题

关于查找首先有2个知识点需要你清楚 线性查找 二分查找。这里我们讲二分查找

二分查找经典的实现就是我们小时候玩的猜数游戏:保证7步之内猜出你写的一个数字(范围1~1024)

二分查找的算法(其实代码实现算法比文字说明更直观):

一个大小为1024的数组,装载了1~1024。我们有个上边界0,下边界1024,和中间位置。中间位置永远是下边界-上边界除以2得到的。取出中间位置上的值与你传入的数据(猜的数字)比较,动态改变上边界和下边界。如果取出的值大于你猜的值,那就重新赋值下边界为你这个中间值减1,相反则下边界重新赋值为中间值加1,如果相等那就找到啦


public int halfFind(int searchKey) {
    int lowerBound = 0;
    int upperBound = nElements;
    int mid;
    while(true){
        mid = (lowerBound + upperBound) / 2;
        if ( a[mid] == searchKey ) {
            return mid;
        } else if ( lowerBound > upperBound ) {
            return -1;// did not find
        } else {
            if ( a[mid] > searchKey ) {
                upperBound = mid - 1;
            } else {
                lowerBound = mid + 1;
            }
        }

    }
}

不需要细细说明,你就应该可以感觉到二分查找明显会比你一步步从头到尾查找来的快。那到底对于一个大小为N的数组,二分查找用了多少步呢?

直接给出答案logN,底数为2。以图形表示函数,就很清楚当数组越大,二分查找就越快。

猜你喜欢

转载自blog.csdn.net/a15998126054/article/details/83184035