您的位置:首页 > 其它

在一个循环有序的数组里查找特定值

2008-11-20 00:10 417 查看
在一个循环有序的数组里查找特定值。(循环有序就是指数组里的各项都是有序的,但是最小值不一定是数组的第 0 项,而可能是其中任意一项,然后逐项递增,到数组尾的时候再回到第 0 项)

在这样的数组中查找就不能直接使用二分法了。可以使用一个二分法的变形,除了判断中心值之外,还要判断两端的值,以此确定循环开始点在中点的哪一边,并判断所查找的值是否在循环起始点的哪边,并采用不同的处理方式。

#include <stdio.h>

int mysearch(int arr[], int s, int e, int value)

{

int m = (s + e) / 2;

for (; s < e; m = (s + e) / 2)

{

if (arr[m] == value)

{

return m;

}

/*

* s m e

* 1 2 3

*/

if (arr[s] <= arr[m] && arr[m] <= arr[e])

{

if (value < arr[m])

{

e = m - 1;

}

else

{

s = m + 1;

}

}

/*

* s m e

* 2 3 1

*/

else if (arr[s] <= arr[m] && arr[m] >= arr[e])

{

if (value < arr[m] && value >= arr[s])

{

e = m - 1;

}

else

{

s = m + 1;

}

}

/*

* s m e

* 3 1 2

*/

else

{

if (value > arr[m] && value <= arr[e])

{

s = m + 1;

}

else

{

e = m - 1;

}

}

}

if (arr[s] == value)

{

return s;

}

return -1;

}

int main(int argc, char * argv[])

{

int i;

int arr[] = {70, 80, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int len = sizeof(arr) / sizeof(arr[0]);

for (i = 0; i < len; ++i)

{

printf("%d/n", mysearch(arr, 0, len - 1, arr[i]));

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐