顺序查找和二分查找算法多种编程语言实现
查找,也可称检索,是在多个信息中寻找一个特定的信息元素,在此介绍顺序查找和二分查找算法的多种代码实现。
顺序查找
顺序查找也称为线形查找,属于无序查找算法。
顺序查找适合于存储结构为顺序存储或链接存储的线性表。
基本思想:从数据结构线形表的一端开始,顺序扫描,依次将扫描到的元素与查找关键字(给定查找值)相比较,若相等则表示查找成功;若扫描结束仍没有找到等于k的元素,表示查找失败。
假设要在10,34,86,8,15,56,45,67中,顺序找56和20
查找成功输出其位置下标,查找失败输出-1
C++代码
#include <iostream>
using namespace std;/**
* 线性查找算法
* @param arr 查找的数组
* @param target 查找的元素
* return 返回所在位置的下标
*/
int seqSearch(int *arr,int target){for (int i = 0; i < sizeof(arr); i++) {if (arr[i] == target){return i;}}return -1; //返回-1表示没找到
}
int main(){int arr[] = {10,34,86,8,15,56,45,67};cout << seqSearch(arr, 56) << endl;cout << seqSearch(arr, 20) << endl;return 0;
}
Java代码
public class SeqSearch {public static void main(String[] args) {int[] arr = {10,34,86,8,15,56,45,67};System.out.println(seqSearch(arr, 56));System.out.println(seqSearch(arr, 20));}/*** 线性查找算法* @param arr 查找的数组* @param target 查找的元素* return 返回所在位置的下标*/public static int seqSearch(int[] arr,int target){for (int i = 0; i < arr.length; i++) {if (arr[i] == target){return i;}}//返回-1表示没找到return -1;}
}
Python代码
# 线性查找算法
# @param data 查找的列表数组
# @param key 查找的元素
# return 返回所在位置的下标
def linear_search(data,key):lens = len(data)for i in range(lens):if data[i] == key:return i # 找到返归下标return -1 # 未找到返归-1values = [10,34,86,8,15,56,45,67] #数据列表
print(linear_search(values,56))
print(linear_search(values,20))
二分查找(Binary Search)
二分查找(Binary Search)算法,也叫折半查找算法,元素必须是有序的,如果是无序的则要先进行排序操作。
基本思想:元素必须是有序的,假设表中元素是按升序排列,将表中间位置元素与查找关键字(给定查找值)比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置元素大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到查找到或至结束没发现这样的元素。
假设要在10, 20, 30, 40, 50, 60, 70中,二分查找60和90
查找成功输出其位置下标,查找失败输出-1
C++代码
#include <iostream>
using namespace std;
/**
* 二分法查找算法
* @param Arr 查找的数组
* @param low 低端元素下标
* @param high 高低端元素下标
* @param k 查找的元素
* return 返回所在位置的下标
*/
int SearchK(int *Arr,int low,int high,int k)
{ int mid; //记录中间位置 while (low<high){mid = (low + high) / 2; if (Arr[mid] ==k)return mid + 1; else {if (Arr[mid] < k)//右边查找 low = mid + 1; elsehigh = mid - 1; }} return -1;//没找到返回-1
}int main()
{int p[] = { 10, 20, 30, 40, 50, 60, 70 };cout<<SearchK(p, 0, 6, 60)<<endl;cout << SearchK(p, 0, 6, 90)<<endl;return 0;
}
Java代码
public class BinarySearch {public static void main(String[] args) {int[] p = { 10, 20, 30, 40, 50, 60, 70 };System.out.println(SearchK(p, 0, 6, 60));System.out.println(SearchK(p, 0, 6, 90));}/**
* 二分法查找算法* @param Arr 查找的数组* @param low 低端元素下标 * @param high 高低端元素下标 * @param k 查找的元素* return 返回所在位置的下标*/public static int SearchK(int[] Arr,int low,int high,int k){int mid; //记录中间位置 while (low<high){mid = (low + high) / 2; if (Arr[mid] ==k)return mid + 1; else {if (Arr[mid] < k)//右边查找 low = mid + 1; elsehigh = mid - 1; }} return -1;//没找到返回-1 }
}
Python代码
# 二分法查找算法
# @param Arr 查找的数组
# @param low 低端元素下标
# @param high 高低端元素下标
# @param k 查找的元素
# return 返回所在位置的下标
def SearchK(Arr,low,high,k):while low<high:mid = (low + high) // 2if Arr[mid] ==k:return mid + 1else:if Arr[mid] < k: #右边查找low = mid + 1else:high = mid - 1return -1 #没找到返回-1p = [ 10, 20, 30, 40, 50, 60, 70 ] #数据列表
print(SearchK(p, 0, 6, 60))
print(SearchK(p, 0, 6, 90))