• 【Java】和【C语言】实现一个有序数组的二分查找


    目录

    1.二分查找介绍

    2. 二分查找代码实现

    2.1 Java代码实现

    2.2 C语言代码实现

    3. 查找的思路

    3.1 mid小于要找的元素

    3.2 mid大于要找的元素 

    4. 二分查找优缺点


    1.二分查找介绍

            二分查找也叫折半查找,首先计算数组中间的位置(元素个数除以2),将数组中间位置处的下标与查找的元素进行比较,如果相等,则查找成功;否则利用中间位置将数组分为左、右两个部分,如果中间位置的下标大于查找的元素,则查找左子表,否则查找右子表。重复上面的过程,直到找到要查找的关元素为止,否则查找失败不存在此元素。 

    2. 二分查找代码实现

    2.1 Java代码实现

    1. /**
    2. * @project 二分查找
    3. **/
    4. public static int binarysearch(int[] array, int k) {
    5. int sz = array.length;//求数组长度
    6. int left = array[0];//左下标
    7. int right = sz - 1;//右下标
    8. while (left <= right) {
    9. int mid = (left + right) / 2;//中间下标
    10. if (array[mid] > k) {//要找的元素在左边
    11. right--;
    12. } else if (array[mid] < k) {//要找的元素在右边
    13. left++;
    14. } else {//找到了返回下标
    15. return mid - 1;//下标是从0开始的,每一个元素的下标都是 n-1
    16. }
    17. }
    18. return -1;
    19. }
    20. public static void main(String[] args) {
    21. int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    22. //int k = 7;//查找的元素
    23. Scanner input = new Scanner(System.in);
    24. System.out.print("输入要查找的元素:");
    25. int k = input.nextInt();//输入要查找的元素
    26. int ret = binarysearch(array, k);
    27. /**
    28. * @rule 返回1说明找到了 - 返回-1说明没找到
    29. * @rule 输出找到元素的下标
    30. **/
    31. if (-1 == ret) {
    32. //找不到
    33. System.out.println("找不到,因为元素不存在");
    34. } else {
    35. System.out.println("找到了,下标是:" + array[ret]);
    36. }
    37. }

    2.2 C语言代码实现

    1. #include
    2. int binary_search(int arr[], int k, int sz)
    3. {
    4. int left = 0;//左下标
    5. int right = sz - 1;//右下标
    6. while (left <= right)//左下标<=右下标说明中间还有元素要查找
    7. { //中间元素的下标
    8. int mid = (left + right) / 2;//mid就是折半之后的数组元素个数
    9. //mid-1和mid+1逐渐接近要找的元素
    10. if (arr[mid] > k)//mid数组的下标大于k说明要找的元素在数组的左边
    11. {
    12. right = mid - 1;//mid-1赋给右边的左边
    13. }
    14. else if (arr[mid] < k)//mid数组的下标小于k说明要找的元素在数组的右边
    15. {
    16. left = mid + 1;//mid+1赋给左边的下标
    17. }
    18. else
    19. {
    20. return mid;//返回找到的下标
    21. }
    22. }
    23. return -1;//整个数组都查找了一遍,没有要找到要找的元素就返回-1
    24. }
    25. int main()
    26. {
    27. int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    28. int k = 7;//要找的元素,找到后输出它的下标
    29. //数组的个数=数组的总大小/数组一个元素的大小
    30. int sz = sizeof(arr) / sizeof(arr[0]);//sz就是数组元素的个数
    31. int ret = binary_search(arr, k, sz);
    32. if (-1 == ret)//ret等于接收的-1说明整个数组没有要找的元素
    33. {
    34. printf("找不到了\n");
    35. }
    36. //ret不等于接收的-1就说明找到了
    37. else
    38. {
    39. printf("找到了,下标是:%d\n", ret);//输出找到的元素下标
    40. }
    41. return 0;
    42. }

    3. 查找的思路

    3.1 mid小于要找的元素

    3.2 mid大于要找的元素 

    4. 二分查找优缺点

    1. 优点是比较次数少,查找速度快,平均性能好;
    2. 其缺点是要求待查表为有序表,且插入删除困难。
    3. 因此二分查找方法适用于不经常变动而查找频繁的有序列表。

    使用条件:查找序列是顺序结构,有序。

  • 相关阅读:
    ElasticSearch诞生
    il2cpp分析-gobal-metadata.dat解密
    React——ES6语法补充
    手机怎么压缩图片?通过三种压缩操作
    05【NIO核心组件之Channel】
    mysql中explain使用说明
    极限多标签学习之-PLT
    ant-design-vue 下拉框随页面滚动问题
    QT读取Excel表格内容到Table Widget
    Python-爬虫(生产者,消费者模型爬取新发地蔬菜批发数据,数据保存到csv文件)
  • 原文地址:https://blog.csdn.net/m0_63033419/article/details/126151595