问题
答案
#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;
}
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);
}
}