java二分法排序_Java中的冒泡排序和二分法

什么是冒泡排序?

冒泡排序就是在一个数组中有存在不同顺序的元素,需要将其按照升序进行排列的一种排列顺序,是最基本的一种数组的排列,排列方式类似于吐泡泡从小到大。

冒泡排序的依据?

按照数组的下标顺序依次两两比较元素的大小,小的排到前面,大的一直向后移动,重复的两两交换在第一次就可以把最大的元素排到数组的尾部,知道整个数组所有元素比较一轮结束。

冒泡排序的实现思路?

1.首先把需要比较的数组拿过来

2.每一个位置都需要向后比较,所以需要比较数组长度-1轮,而每一个元素又要两两相比,每一个元素也需要比较一轮,所以需要两个循环帮我们完成。

3.数据的交换,在当前位置x和后一个位置x+1的对应元素进行等值比较如果大就根据第三变量进行赋值交换,如果小则保持原位。

具体代码实现:

这个是基础算法,比较简单容易实现,还有一个优化算法如下:

画图分析:

也就是说每一次比完,都会找到一个最大的数字,后面的每一轮比较都不需要再比所有数字,而是比上一次少一个,这是第一点,第二点是如果本来这个数组就是有序的那么就不需要比较了。定义flag默认有序。

数组我们排序好了,那么如何获取数组里面我们想要的元素的位置那?现在我们来用二分法来快速查找一下10的位置在哪?

什么是二分法以及实现思路?

二分法检索又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。

从图我们可以看出来,二分法查找的前提是数组必须有序,然后通过折半和当前元素对比大小判断范围,如果大于中间数则继续折半中间数之后区域进行判断,反之相同,直到找到对应元素,找到返回索引,找不到返回-1。

代码如下:

以上就是对数组的排序和查找两项最基本的也是必须要会手动敲出来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分法排序冒泡排序是两种不同的排序算法。 二分法排序是一种基于比较的排序算法,其原理类似于数学的二分法。它的算法思想是,在总共有N个元素的数组,当插入第i个元素时,对前面的0~i-1个元素进行折半查找,先跟间的元素比较,如果小于间元素,则再对前一半的元素进行折半查找;否则,对后一半的元素进行折半查找。重复这个过程,直到左边的索引小于右边的索引,然后将第i个元素插入目标位置,并将目标位置之间的所有元素后移。最后得到一个有序的数组。 冒泡排序是一种简单但效率较低的排序算法。它的基本思想是通过相邻元素的比较和交换来实现排序。在Java冒泡排序通常使用双层循环来实现,外层循环控制排序轮数,总循环次数为要排序数组的长度减1。而内层循环主要用于对比相邻元素的大小,以确定是否需要交换位置。随着排序轮数的增加,对比和交换次数逐渐减少,直到得到一个有序的数组。 以下是一个使用Java语言实现二分法排序冒泡排序的示例代码: ``` // 二分法排序 public static void binarySort(int[] arr) { int len = arr.length; for (int i = 0; i < len; i++) { int target = arr[i]; int left = 0; int right = i - 1; int mid; while (left <= right) { mid = (left + right) / 2; if (target < arr[mid]) { right = mid - 1; } else { left = mid + 1; } } for (int j = i - 1; j >= left; j--) { arr[j + 1] = arr[j]; } arr[left] = target; } } // 冒泡排序 public static void bubbleSort(int[] arr) { int len = arr.length; for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值