对于一个无序数组想要对其使用二分查找首先要将其变成一个有序数组,我们借助冒泡排序让其变成一个有序数组。
那么我们先介绍一下冒泡排序。
冒泡排序(Bubble Sort):
冒泡排序通过元素的两两比较,判断是否符合要求,不符合就交换位置来达到排序的目的。类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设我们的数组从小到大排序,即大数在后,小数在前。小(大)数经过不断的交换由水底慢慢的浮到水的顶端。
算法描述:
依次比较相邻的两个数,小数放前面,大数放后。
第一趟:比较第1个数与第2个数,若数1>数2,则交换位置,若相反,则不动。在比较第2个数和第3个数,直至最后一个。
第二趟:比较数1和数2,遵循第一趟的原则。但是,此时的最后一个数已经为最大,不再参与比较,不需比较。
第三趟:重复第二轮,这轮最后两个数不再参与比较。
后面依次类推,每轮需要比较的数从后面减1。
例如:
一共十个数据
* 元数据 68 55 79 32 11 77 89 45 99 12 比较次数
* 第一轮比较9次 55 68 32 11 77 79 45 89 12 [99] 9
* 第二轮 55 32 11 68 77 45 79 12 [89] 8
* 第三轮 32 11 55 68 45 77 12 [79] 7
* 第四轮 11 32 55 45 68 12 [77] 6
* 第五轮 11 32 45 55 12 [68] 5
* 第六轮 11 32 45 12 [55] 4
* 第七轮 11 32 12 [45] 3
* 第八轮 11 12 [32] 2
* 第九轮 11 [12] 1
代码实现:
public class MaoPao {
public static void main(String[] args) {
int[] arr = { 68 ,55 ,79 ,32 ,11 ,77 ,89 ,45 ,99 ,12 };
//外层循环表示比较的轮数,因为最后一轮剩下一个数不用比较
for (int i = 1 ; i < arr.length; i++){
//内层循环控制比较的次数
for (int j = 0 ; j < arr.length - i; j++){
//判断两个数的大小,如果前面的数比后面的大,就将两个数值交换位置
if (arr[j] > arr[j + 1]){
int temp = arr[j];//把大的数放在中间变量里面
arr[j] = arr[j + 1];
arr[j + 1] = temp;//将大的数据放在原来小的里面
}
}
}
System.out.println("排序数组:" + Arrays.toString(arr));
}
}
实现对数组有序排列以后我们进行冒泡排序。
简单介绍一下二分查找:
二分查找(Binary search)也称折半查找,是一种效率较高的查找方法。但是,二分查找要求线性表中的记录必须按关键码有序,并且必须采用顺序存储。
算法描述:
依次比较相邻的两个数,小数放前面,大数放后。
第一趟:比较第1个数与第2个数,若数1>数2,则交换位置,若相反,则不动。在比较第2个数和第3个数,直至最后一个。
第二趟:比较数1和数2,遵循第一趟的原则。但是,此时的最后一个数已经为最大,不再参与比较,不需比较。
第三趟:重复第二轮,这轮最后两个数不再参与比较。
后面依次类推,每轮需要比较的数从后面减1。
代码实现:
public class Erfen {
public static void main(String[] args) {
int[] arr = {11, 12, 32, 45, 55, 68, 77, 79, 89, 99};
int key = 12;//要查找的数
int max = arr.length - 1;//设置max指针
int min = 0;//设置min指针
int mid = -1;//设置mid指针
while ( min <= max){
mid = (max + min) / 2;
if (arr[mid] > key){
//我们想要的值在左边
max = mid - 1;
}else if (arr[mid] < key){
mid = mid + 1;
}else if (arr[mid] == key){
break;
}
}
if (min > max){
//如果min > max 说明这个值不在这个数组内
System.out.println("这个值不在这个数组内");
}else {
System.out.println("这个值在这个数组内的第" + (mid + 1) + "个");
}
}