递归折半查找多个相同元素中的第一个或者最后一个

来源:互联网 发布:cf网络异常的解决办法 编辑:程序博客网 时间:2024/05/21 18:39
/***********************************************************************
如果待查找的元素在数组中有多个,则返回其中任意一个(第一个或者最后一个)
************************************************************************/
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

void TraversalArray(int array[], int len)
{
    assert(array != NULL);
    assert(len >= 0);

    unsigned index = -1;

    for(index = 0; index < len; index++)
    {
        printf("%3d", array[index]);
    }

    printf("\n");
}

int Is_Sort(int array[], int low, int high)
{
    int i = -1;

    for(i = low; i < high-1; i++)
    {
        if(array[i] > array[i+1])
        {
            return    0;
        }
    }

    return    1;
}

int BinarySearch(int array[], int low, int high, int key)
{
    if(low > high)
    {
        return -1;
    }

    assert(array != NULL);
    assert(Is_Sort(array, low, high));

    if(key == array[low])
    {
        return    low;//打开这个 if(),则找到第一个要找的元素
    }


/*
    if(key == array[high])
    {
        return    high;//打开这里的 if(),则找到最后一个要查找的元素
    }
*/
    int mid = (low + high)/2;
    if(key == array[mid])
    {
        return    BinarySearch(array, low, mid, key);/*递归继续查找特殊位置的元素*/
    }
    else if(key < array[mid])
    {
        return BinarySearch(array, low, mid-1, key);/*在小的那一段继续折半查找*/
    }
    else
    {
        return    BinarySearch(array, mid+1, high, key);/*在大的那一半继续折半查找*/
    }
}

int main(void)
{
    int array[] = {0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9};

    TraversalArray(array, sizeof(array)/sizeof(array[0]));

    int index = BinarySearch(array, 0, sizeof(array)/sizeof(array[0])-1, 2);
    printf("index = %d \n", index);

    return    0;
}
0 0
原创粉丝点击