关于二分查找与冒泡排序

简介: 关于二分查找与冒泡排序

一.关于二分查找

①二分查找的两种不同的代码实现

二分查找:在有序数组中将数组筛选的范围不断进行缩减,从而达到提高效率和查找到有效数据的目的

第一种:

public static int binarySearch1(int[]arr,int num){

   //设置初始指向

   int left=0;

   int right=arr.length-1;

   while(left<=right){

       int mid=((right-left)>>1)+left;

       if(num>arr[mid]){

           left=mid+1;

       }

       else if(num<arr[mid]){

           right=mid-1;

       }

       else

           return mid;

   }

   return -1;

}

322a6023becc4079b7d9b91776936244.png

左边闭合和右边闭合的含义是:左右两侧边界都在数组筛选范围内

所以在这种情况下,循环的范围变化如下:left=mid+1;right=mid-1

条件是:left<=right(因为相等时恰好存在一个元素)

第二种:

//实现二分查找2

public static int binarySearch2(int[]arr,int num){

   //设置初始值

   int left=0;

   int right=arr.length;

   while (left<right){

       int mid=((right-left)>>1)+left;

       if (arr[mid]<num){

           left=mid+1;

       }

       else if(arr[mid]>num){

           right=mid;

       }

       else return mid;

   }

   return -1;

}


左边闭合,右边开,意味着右边所指向的元素并不包括

那么循环范围随着发生变化 right=mid(因为右边所指向的元素并不包括);left=mid+1

循环的条件:left<right(因为相等时由于右边并不包括,这时实际并不存在元素,如果是left<=right,两个相等时则会导致数组越界)

③另外关于mid 的取法:(((right-mid)>>1)+left)

图示如下:

f2b6e20cbf9648aeb44f73ef1c6127ad.png

左边闭合,右边开,意味着右边所指向的元素并不包括

那么循环范围随着发生变化 right=mid(因为右边所指向的元素并不包括);left=mid+1

循环的条件:left<right(因为相等时由于右边并不包括,这时实际并不存在元素,如果是left<=right,两个相等时则会导致数组越界)

③另外关于mid 的取法:(((right-mid)>>1)+left)

图示如下:



118655ba0964423385b45f4fac68b773.png

这样定义mid的好处是:如果mid=(left+right)/2存在导致栈溢出的可能性

相比之下,这样能够有效避免栈溢出,同时,用移位操作符代替/,能提高一点点效率

二.冒泡排序的优化

public static void swap(int[]arr,int m,int n){

       int temp=arr[m];

       arr[m]=arr[n];

       arr[n]=temp;

   }

   public static void bubbleSort(int[]arr){

       boolean flag=false;

       for (int i=0;i<arr.length-1;++i){

           for (int j = 0; j < arr.length-1-i; j++) {

               if (arr[j]>arr[j+1]){

                  swap(arr,j,j+1);

                  flag=true;

               }


           }

           if(flag==false)

               return;

           flag=false;

       }

   }

}

优化部分是加粗标红的部分,思路如下:因为考虑到冒泡循环实际上是不断比较两个相邻的元素达到排序数组元素的目的,而每次内层循环都能排好一个元素,而当内层循环的一次循换中如果发现在本次循换中没有发现两个需要交换的元素的时候,则可以说明此时实际上数组已经排好序了,不需要进行下一步的交换,直接return


所以设置一个flag的Boolean类型的标志符,能提高一些效率


相关文章
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
592 21
|
12天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
960 110
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。