java二分排序法原理_基础算法-冒泡排序与二分查找(JAVA实现)

基础算法:

冒泡排序

冒泡排序:将无序的数据有序化,

将相邻的两个元素进行比较, 使最大值或者最小值一步步冒上去,所以称为冒泡排序.

冒泡排序思想:

以升序为例:

在一个数组中,将相邻的两个元素A与B进行比较,如果A大于B 则A与B交换位置,若小于B则不进行操作, 变量交换通过中间变量来进行.

代码示例:

public static void main(String[] args) {

int[] a = {3, 1, 6, 5, 2, 9, 7, 8};

int temp = 0;

for(int i=a.length-1;i>0;i--){

for(int j=0;j

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

temp = a[j+1];

a[j+1]= a[j];

a[j] = temp;

}

}

}

打印结果为:12356789

加上思路便于理解:

i=数组长度-1 是为了进行循环次数通过j+1的方法 如果不进行长度-1的话,会造成数组下标越界的错误.

执行过程:当3>1时,向前移动,3与6相比,6大,所以6不动, 6>5 6向前移动. 由于6>5>3, 然后3>1 ,那么6一定>1, 此时6肯定是最大的, 而5与前边的大小没有直接关系, 所以无法进行大小数值确定, 需要重新比较,数组对于我们来说相对有序,但是对于冒泡算法的程序来说,与无序没有区别.

重复操作之后, 9会在最后一位, 而我们的第一层循环也已经执行完毕. 第二次时,再进行一次循环, 重复操作到最后,只需要一次比较就是第一位和第二位的比较,

上边就是冒泡排序的原理与思想.

二分查找

当我们查找一个有序的线性表的时候,再通过遍历进行全表搜索,会进行大量的资源浪费,可以使用二分查找的思想进行查找.

使用二分查找的限制:

1.线性表

2.有序

二分查找的思路:

每一次与数组的中间值进行对比, 判断前后顺序,再进行对比, 如此反复,直到找到需要的变量.

话不多说 直接上代码 用代码进行解析:

/**

*二分查找

* @param array 传递进来的数组

* @param des 要查找的值

* @return

*/

public static int binarySearch(int[] array,int des){

int low = 0;//设置数组下标最小值

int max = array.length-1;//数组下标最大值

while(low<=max){

int mid = (max+low)>>>1 ;//找到数组中间值.

if(array[mid]==des){

//当中间值正好为想要查找的数值时,直接返回数组下标

return mid;

}else if(array[mid]>des){

//中间值大 所以锁定区域在前面,重新设定范围

max = mid-1;

}else {

//中间值小 所以锁定区域在后面,重新设定范围

low = mid+1;

}

}

//未发现此值时 返回-1

return -1;

}

递归实现:

public static int recursionBinarySearch(int[] array,int des,int low, int max){

int mid = (low+max)>>>1;

if(array[mid]==des){

//当中间值正好为想要查找的数值时,直接返回数组下标

return mid;

}

if(low>=max){

return -1;

}

else if(array[mid]>des){

//中间值大 所以锁定区域在前面,重新设定范围

max = mid-1;

return recursionBinarySearch(array,des,low,max);//将值设定后传入下一层,层层调用 直到相等.

}else if(array[mid]

//中间值小 所以锁定区域在后面,重新设定范围

low = mid+1;

return recursionBinarySearch(array,des,low,max);//将值设定后传入下一层,层层调用 直到相等.

}

return -1;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值