二分查找的灵活应用
2013-07-26 17:46
295 查看
二分查找
1.找任意一个出现key的下标
思路:mid位置小于key则low右移,大于key则high左移,等于则直接返回mid
2.找第一个出现key的下标
思路:mid位置小于key则low右移,大于等于key则high左移,若low不越界且该位置的值等于key,则直接返回low,否则表示该值不存在
3.找最大的小于key的下标
思路:mid位置小于key则low右移,大于等于key则high左移,若high不越界则直接返回high,否则表示该值不存在
4.找最后一个出现key的下标
思路:mid位置小于等于key则low右移,大于key则high左移,若high不越界且该位置的值等于key,则直接返回high,否则表示该值不存在
5.找最小的大于key的下标
思路:mid位置小于等于key则low右移,大于key则high左移,若low不越界则直接返回low,否则表示该值不存在
代码:
1.找任意一个出现key的下标
思路:mid位置小于key则low右移,大于key则high左移,等于则直接返回mid
2.找第一个出现key的下标
思路:mid位置小于key则low右移,大于等于key则high左移,若low不越界且该位置的值等于key,则直接返回low,否则表示该值不存在
3.找最大的小于key的下标
思路:mid位置小于key则low右移,大于等于key则high左移,若high不越界则直接返回high,否则表示该值不存在
4.找最后一个出现key的下标
思路:mid位置小于等于key则low右移,大于key则high左移,若high不越界且该位置的值等于key,则直接返回high,否则表示该值不存在
5.找最小的大于key的下标
思路:mid位置小于等于key则low右移,大于key则high左移,若low不越界则直接返回low,否则表示该值不存在
代码:
#include "stdafx.h" #include <iostream> using namespace std; //二分查找 //1.找任意一个出现key的下标 // 思路:mid位置小于key则low右移,大于key则high左移,等于则直接返回mid int BinarySearchAnyKey(int nArr[], int nLength, int key) { int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] > key) { nHigh = nMid - 1; } else if (nArr[nMid] < key) { nLow = nMid + 1; } else { return nMid; } } return -1; } //2.找第一个出现key的下标 // 思路:mid位置小于key则low右移,大于等于key则high左移,若low不越界且该位置的值等于key,则直接返回low,否则表示该值不存在 int BinarySearchFirstKey(int nArr[], int nLength, int key) { int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] >= key)//相等向左移 { nHigh = nMid - 1; } else { nLow = nMid + 1; } } if (nLow >= 0 && nLow < nLength && nArr[nLow] == key) { return nLow; } else { return -1; } } //3.找最大的小于key的下标 // 思路:mid位置小于key则low右移,大于等于key则high左移,若high不越界则直接返回high,否则表示该值不存在 int BinarySearchMaxIndexLessThanKey(int nArr[], int nLength, int key) { int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] >= key)//相等向左移 { nHigh = nMid - 1; } else { nLow = nMid + 1; } } if (nHigh >= 0 && nHigh < nLength) { return nHigh; } else { return -1; } } //4.找最后一个出现key的下标 // 思路:mid位置小于等于key则low右移,大于key则high左移,若high不越界且该位置的值等于key,则直接返回high,否则表示该值不存在 int BinarySearchLastKey(int nArr[], int nLength, int key) { int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] > key) { nHigh = nMid - 1; } else //相等向右移 { nLow = nMid + 1; } } if (nHigh >= 0 && nHigh < nLength && nArr[nHigh] == key) { return nHigh; } else { return -1; } } //5.找最小的大于key的下标 // 思路:mid位置小于等于key则low右移,大于key则high左移,若low不越界则直接返回low,否则表示该值不存在 int BinarySearchMinIndexMoreThanKey(int nArr[], int nLength, int key) { int nLow = 0; int nHigh = nLength - 1; int nMid = 0; while (nLow <= nHigh) { nMid = nLow + ((nHigh - nLow) >> 1); if (nArr[nMid] > key) { nHigh = nMid - 1; } else//相等向右移 { nLow = nMid + 1; } } if (nLow >= 0 && nLow < nLength) { return nLow; } else { return -1; } } void Mix(int nArr[], int nLength, int key) { cout << "找到任一" << key << "的位置:" << BinarySearchAnyKey(nArr, nLength, key) << endl; cout << "找到第一次出现" << key << "的位置:" << BinarySearchFirstKey(nArr, nLength, key) << endl; cout << "找到最大的小于" << key << "的数的位置:" << BinarySearchMaxIndexLessThanKey(nArr, nLength, key) << endl; cout << "找到最后一次出现" << key << "的位置:" << BinarySearchLastKey(nArr, nLength, key) << endl; cout << "找到最小的大于" << key << "的数的位置:" << BinarySearchMinIndexMoreThanKey(nArr, nLength, key) << endl << endl; } int _tmain(int argc, _TCHAR* argv[]) { int nArr[8] = {2,3,3,3,3,5,6,7}; Mix(nArr, 8, 3); Mix(nArr, 8, 4); system("pause"); return 0; }运行结果:
相关文章推荐
- SDUT 3330----顺序表应用6:有序顺序表查询(二分查找)
- First Bad Version(二分查找的应用)
- 二分查找应用-旋转数组
- 二分查找的应用
- java的String类和StringBuffer的应用 冒泡排序 选择元素 二分查找
- 华为中级机试题--二分查找树的应用
- (二分查找的应用)LeetCode#540. Single Element in a Sorted Array
- 循环语句的简单应用(二分查找、猜数字游戏)
- 二分查找的简单应用
- 二分查找及简单应用
- 【编程珠玑】第二章 二分查找的巧妙应用
- 20、二分查找的实现与应用
- 二分查找算法的应用
- 【二分查找】在排序数组中,找出给定数字的出现次数 以及二分其他应用
- 二分查找在数组中应用的若干实例
- 二分查找的实现和应用汇总(转载)
- 巩固基础篇:经典二分查找模型及其应用
- 二分查找算法在C/C++程序中的应用示例
- 剑指Offer--数组在排序数组中出现的次数--二分查找的应用
- 二分求解 三角形 stl的应用 涉及范围的二分查找可以先求上界再算下界,结果即上界减下界