递归应用:折半查找法
生活随笔
收集整理的這篇文章主要介紹了
递归应用:折半查找法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
折半查找法介紹
在計算機科學(xué)中,折半搜索(英語:half-interval search),也稱二分搜索(英語:binary search)、對數(shù)搜索(英語:logarithmic search),是一種在有序數(shù)組中查找某一特定元素的搜索算法。
搜索過程從數(shù)組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結(jié)束;如果某一特定元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。
迭代法實現(xiàn)代碼
//迭代實現(xiàn) 折半查找算法 int IndexEleArray1(int* arr,int len,int data) {//快速辨別元素不在數(shù)組中if (arr[0] > data || arr[len - 1] < data){return -1;}int min = 0;int max = len-1;while (min <= max){int mid = (max - min) / 2 + min;if (data > arr[mid]){min = mid+1;}else if (data < arr[mid]){max = mid-1;}else{return mid;}}//找不到返回-1return -1; }
遞歸法實現(xiàn)代碼
//遞歸實現(xiàn) 折半查找算法 int IndexEleArray2(int* arr,int min, int max, int data) {//快速辨別元素不在數(shù)組中if (data < arr[min] || data>arr[max]){return -1;}int mid = (max - min) / 2 + min;if (min <= max){if (data > arr[mid]){min = mid+1;return IndexEleArray2(arr, min, max, data);}else if (data < arr[mid]){max = mid-1;return IndexEleArray2(arr, min, max, data);}else{return mid;}}else{ //找不到返回-1return -1;} }
完整代碼
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <math.h> //迭代實現(xiàn) 折半查找算法 int IndexEleArray1(int* arr,int len,int data) {//快速辨別元素不在數(shù)組中if (arr[0] > data || arr[len - 1] < data){return -1;}int min = 0;int max = len-1;while (min <= max){int mid = (max - min) / 2 + min;if (data > arr[mid]){min = mid+1;}else if (data < arr[mid]){max = mid-1;}else{return mid;}}//找不到返回-1return -1; } //遞歸實現(xiàn) 折半查找算法 int IndexEleArray2(int* arr,int min, int max, int data) {//快速辨別元素不在數(shù)組中if (data < arr[min] || data>arr[max]){return -1;}int mid = (max - min) / 2 + min;if (min <= max){if (data > arr[mid]){min = mid+1;return IndexEleArray2(arr, min, max, data);}else if (data < arr[mid]){max = mid-1;return IndexEleArray2(arr, min, max, data);}else{return mid;}}else{ //找不到返回-1return -1;} }int main(int argc, char *argv[]) {printf("請輸入int數(shù)組元素個數(shù):");int count = 0;scanf("%d", &count);int* numArr = (int*)malloc(sizeof(int)*count);char numStr[10] = { 0 };printf("請輸入從小到大的數(shù)據(jù)元素:");for (size_t i = 0; i < count; i++){scanf("%s", &numStr);int num = atoi(numStr);numArr[i] = num;}while (1){printf("請輸入查找元素(0退出):");int data = 0;scanf("%d", &data);if (0 == data){break;}int index1 = IndexEleArray2(numArr, 0, count - 1, data);int index2 = IndexEleArray1(numArr,count, data);printf("迭代法查找元素位置:%d\n", index1);printf("遞歸法查找元素位置:%d\n", index2);}return 0; }
檢測結(jié)果
總結(jié)
以上是生活随笔為你收集整理的递归应用:折半查找法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode15:三数之和(转载思路
- 下一篇: 2018年的最后一篇随笔