一、順序查找
1.原理
2.代碼
#if 0
const int FindBySeq(const vector<int>& ListSeq, const int KeyData)
{int retrIdx = -1;int size = ListSeq.size();for(int i = 0; i < size; i++) {if (ListSeq.at(i) == KeyData){retrIdx = i;break;}}return retrIdx;
}
#else
const int FindBySeq(const vector<int>& ListSeq, const int KeyData)
{int retrIdx = -1;int size = std::size(ListSeq);//ListSeq.size()for (int item : ListSeq){if (item == KeyData){//查找item在vector中的位置vector<int>::const_iterator it = std::find(ListSeq.begin(), ListSeq.end(), item);retrIdx = std::distance(ListSeq.begin(), it);break;}}return retrIdx;
}
#endif
二、二分查找
1.算法
2.原理
//要求數據是升序的
const int binsearch(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = (low + high) / 2;//奇數,無論奇偶,有個值就行if (keyData < sortedSeq.at(mid)){high = mid - 1;//是mid-1,因為mid已經比較過了}else if (keyData > sortedSeq.at(mid)){low = mid + 1;}else{return mid;}}return -1;
}//要求數據是降序的
const int binsearchLess(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = (low + high) / 2;//奇數,無論奇偶,有個值就行if (keyData < sortedSeq.at(mid)){low = mid + 1;}else if (keyData > sortedSeq.at(mid)){high = mid - 1;}else{return mid;}}return -1;
}
三、插值查找
1.算法
2.原理
//要求序列是升序的
const int insertSearch(const vector<int>& sortedSeq, const int keyData)
{int low = 0, mid, high = std::size(sortedSeq) - 1;while (low <= high){mid = low + (keyData - sortedSeq[low]) / (sortedSeq[high] - sortedSeq[low]) * (high - low);if (keyData < sortedSeq[mid]){high = mid - 1;//是mid-1,因為mid已經比較過了}else if (keyData > sortedSeq[mid]){low = mid + 1;}else{return mid;}}return -1;
}
四、斐波那契查找
1.算法
2.原理
void Fibonacci(vector<int>& FibArr, const int len)
{int i;FibArr.push_back(1);FibArr.push_back(1);for (i = 2; i < len; ++i){FibArr.push_back(FibArr[i - 2] + FibArr[i - 1]);}
}//這里要求序列是升序的
//這個代碼有bug
int Fibonacci_Search(vector<int>& sortedSeq, const int key)
{int n = std::size(sortedSeq);int i, low = 0, high = n - 1;int mid = 0;int k = 0;vector<int>F;Fibonacci(F, 20);while (n > F.at(k) - 1) //計算出n在斐波那契中的數列 ++k;for (i = n; i < F.at(k) - 1; ++i) //把數組補全 {sortedSeq.push_back(sortedSeq.at(high));}while (low <= high){mid = low + F[k - 1] - 1; //根據斐波那契數列進行黃金分割 if (sortedSeq.at(mid) > key){high = mid - 1;k = k - 1;}else if (sortedSeq.at(mid) < key){low = mid + 1;k = k - 2;}else{if (mid <= high) //如果為真則找到相應的位置 return mid;elsereturn -1;}}return 0;
}