基础算法-冒泡排序与二分查找(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<i;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.有序

二分查找的思路:

扫描二维码关注公众号,回复: 92634 查看本文章

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

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

    /**
 *二分查找
 * @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]<des) {
        //中间值小 所以锁定区域在后面,重新设定范围
        low = mid+1;
        return recursionBinarySearch(array,des,low,max);//将值设定后传入下一层,层层调用 直到相等.
    }
    return -1;

}

猜你喜欢

转载自www.cnblogs.com/Curry-Rice/p/8973161.html
今日推荐