2.1.3 Search in Rotated Sorted Array

问题

这里写图片描述

答案

#include <stdio.h>
#include <stdlib.h>

//打印数组
void print_array(int *pArry, int len)
{
    int i;
    for (i = 0; i < len; i++) {
        printf("%02x, ", *(pArry+i));
        if (!((i+1)%8))
            printf("\n");
    }
    printf("\n");
}

//生成需要的原始数组
void get_rotated_sorted_array(int *pArry, int len, int shift)
{
    int i, j, k;
    for (i = 0; i < len; i++)
        pArry[(i+shift)%len] = i;
}

//自己的代码
//优点:貌似使用了尾递归,效率可能是O(log(n))。需注意middle下标归为了前一半数组。
//缺点:代码判断分支较多,不够简洁
int find_value(int *pArry, int head, int tail, int value)
{
    int middle = head + (tail-head)/2;

    if (pArry[middle] == value)
        return middle;
    if (head == tail)
        return -1;
    if ((pArry[head] <= pArry[middle]) && (pArry[middle] <= pArry[tail])) { //小中大
        if (value < pArry[middle])
            return find_value(pArry, head, middle, value);
        else
            return find_value(pArry, middle+1, tail, value);
    } else if ((pArry[head] >= pArry[middle]) && (pArry[middle] <= pArry[tail])) { //大小中
        if ((value > pArry[middle]) && (value <= pArry[tail])) //连续的一半
            return find_value(pArry, middle+1, tail, value);
        else
            return find_value(pArry, head, middle, value);
    } else if ((pArry[head] <= pArry[middle]) && (pArry[middle] >= pArry[tail])) { //中大小
        if ((value >= pArry[head]) && (value < pArry[middle])) //连续的一半
            return find_value(pArry, head, middle, value);
        else
            return find_value(pArry, middle+1, tail, value);
    }
}

int main(void)
{
    int *pArray;
    int len;
    int shift;
    int value;
    int idx;

    printf("please input len:");
    scanf("%d", &len);
    printf("please input right shift value:");
    scanf("%d", &shift);
    printf("please input value to search:");
    scanf("%d", &value);
    pArray = (int *)malloc(len * sizeof(int));
    get_rotated_sorted_array(pArray, len, shift);
    printf("\n");
    printf("rotated %d elements array:\n", shift);
    print_array(pArray, len);
    idx = find_value(pArray, 0, len-1, value);
    printf("\n");
    printf("find in idx %d:\n", idx);
    return 0;
}

结果

这里写图片描述

分析

//别人的代码
//优点:足够简洁,分支判断处理的很好
//缺点:无
int find_value_2(int *A, int n, int target)
{
    int first = 0, last = n;
    int mid;
    while (first != last){
        mid = (first + last) / 2;
        if (A[mid] == target)
            return mid;
        if (A[first] <= A[mid]) {
            if (A[first] <= target && target < A[mid])
                last = mid;
            else
                first = mid + 1;
        } else {
            if (A[mid] < target && target <= A[last-1])
                first = mid + 1;
            else
                last = mid;
        }
    }
    return -1;
}

//自己优化的代码
//优点:简化了代码
//缺点:
int find_value_3(int *pArry, int head, int tail, int value)
{
    int middle = head + (tail-head)/2;

    if (pArry[middle] == value)
        return middle;
    if (head == tail)
        return -1;
    if (value <= pArry[middle]) {
        if (value >= pArry[head])
            return find_value(pArry, head, middle, value);
        else
            return find_value(pArry, middle+1, tail, value);
    } else if (value > pArry[middle]) {
        if (value <= pArry[tail])
            return find_value(pArry, middle+1, tail, value);
        else
            return find_value(pArry, head, middle, value);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值