先介绍一下什么是循环序列?
如果在序列x1,x2,…,xn中,存在某个i使xi是序列中的最小者,
且序列xi,xi+1,…,xn,x1,…xi-1是递增的,则称序列x1,x2,…,xn是循环序列。
递归算法
int
FindMin(
int
[] data,
int
m,
int
n) {
// 找不到,数组中没有任何元素
if (data.Length == 0 ) return - 1 ;
if (n - m <= 1 ) {
if (data[m] < data[n])
return m;
else return n;
}
int i = (m + n) / 2 ; // 取中间数下标
if (data[m] <= data[i]) {
if (data[i] <= data[n])
return m;
else
return FindMin(data, i + 1 , n); // 递归右边
} else
return FindMin(data, m, i); // 递归左边
}
// 找不到,数组中没有任何元素
if (data.Length == 0 ) return - 1 ;
if (n - m <= 1 ) {
if (data[m] < data[n])
return m;
else return n;
}
int i = (m + n) / 2 ; // 取中间数下标
if (data[m] <= data[i]) {
if (data[i] <= data[n])
return m;
else
return FindMin(data, i + 1 , n); // 递归右边
} else
return FindMin(data, m, i); // 递归左边
}
非递归算法
int
FindMin(
int
[] data) {
// 当没有元素时,返回:未找到
if (data.Length == 0 ) return - 1 ;
// 只有一个元素时,这个元素下标即为所求
if (data.Length == 1 ) return 0 ;
// 2个或2个以上元素
int flag = data[ 0 ]; // 取第1个元素
int i = 1 ; // 开始从第2个元素开始查找
while (data[i] > flag) {
i ++ ;
// 如果整个链表已经是递增系列,则第一个元素的下标即为所求。
if (i == data.Length) { i = 0 ; break ; }
}
return i; // 最小元素下标
}
// 当没有元素时,返回:未找到
if (data.Length == 0 ) return - 1 ;
// 只有一个元素时,这个元素下标即为所求
if (data.Length == 1 ) return 0 ;
// 2个或2个以上元素
int flag = data[ 0 ]; // 取第1个元素
int i = 1 ; // 开始从第2个元素开始查找
while (data[i] > flag) {
i ++ ;
// 如果整个链表已经是递增系列,则第一个元素的下标即为所求。
if (i == data.Length) { i = 0 ; break ; }
}
return i; // 最小元素下标
}