常用类的API——数组高级和递归

数组高级

二分查找

二分查找思路: 查找元素的索引,一次排除一半的元素
    1.计算开始索引和结束索引
           start = 0;
           end = array.length-1
    2.计算中的索引 mid = (start+end)/2;
    3.让中间元素和目标元素key进行比较
        array[mid]>key 时: end=mid-1
        array[mid]<key 时:start=mid+1
        array[mid]==key 时:mid就是要找的索引

    4.循环执行2.3步骤,直到start>end结束。如果没有找到返回-1
public class ArrayDemo1 {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8};

        //调用二分查找的方法
        int index = binarySearch(array, 9);
        System.out.println(index);
    }

    //需求:查找数组中指定元素出现的索引
    public static int binarySearch(int[] array, int key) {
        //1.计算开始索引和结束索引
        int start = 0;
        int end = array.length - 1;
        //如果start <= end;就可以一直找
        while (start <= end) {
            //2.计算中的索引 mid = (start+end)/2;
            int mid = (start + end) / 2;
            // 3.让中间元素和目标元素key进行比较
            if (array[mid] > key) {
                //array[mid]>key 时: end=mid-1
                end = mid - 1;
            } else if (array[mid] < key) {
                //array[mid]<key 时:start=mid+1
                start = mid + 1;
            } else {
                //array[mid]==key 时:mid就是要找的索引
                return mid;
            }
        }
        //如果没有找到,就返回-1
        return -1;
    }
}

冒泡排序

冒泡排序的原理图解如下

在这里插入图片描述

冒泡排序的规则:
	1.相邻两个元素两两比较,小的放前面,大的放后面。
	2.一共比较的轮数是n-13.每一轮比较,要上前一轮少一次
//对元素进行排序
public static void sort(int[] array) {
    //1.确定比较的轮数,长度-1
    for (int i = 0; i < array.length - 1; i++) {
        //2.每一轮比较的次数,比前一轮少1次
        for (int j = 0; j < array.length - 1 - i; j++) {
            //3.每一轮相邻的两个元素进行比较,大的往后的,小的往前放
            if (array[j] > array[j + 1]) {
                int temp=array[j];
                array[j]=array[j+1];
                array[j+1]=temp;
            }
        }
    }
}

快速排序

1.找到基准数
2.从右往左找比基准数小的
3.从左往右找比基准数大的
4.把左右两边的数据交换
5.基准数归位
public class ArrayDemo3 {
    public static void main(String[] args) {
        int[] array = {6, 8, 7, 5, 3, 4, 2};
        quiteArray(array, 0, array.length - 1);

        //遍历数组中的元素,并打印
        String s = Arrays.toString(array); 
        System.out.println(s);
    }

    public static void quiteArray(int[] array, int left, int right) {
        //递归的出口
        if (right < left) {
            return;
        }
        //先记录开始索引和结束索引的位置
        int left0 = left;
        int right0 = right; 
        //定义基准数
        int baseNumber = array[left0];

        while (left != right) {
            //从右往左,找比基准数小的
            while (array[right] >= baseNumber && right > left) {
                right--;
            }

            //从左往右,找比基准数大的
            while (array[left] <= baseNumber && right > left) {
                left++;
            }

            //把左右两边的数据进行交换
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
        }

        //把left位置的元素放在left0位置
        array[left0] = array[left];
        //基准数放在left位置
        array[left] = baseNumber;

        quiteArray(array, left0, left - 1);
        quiteArray(array, right + 1, right0);
    } 
}

递归练习

递归指的是方法自己调用自己。

需要注意两个问题
    1.方法调用一定要有出口
    2.调用的次数不能过多

递归求和

/*
   需求:求1~5之间的和
   假设:f(n)表示求n以内的和
        f(1) = 1
        f(2) = f(1) + 2
        f(3) = f(2) + 3
        f(4) = f(3) + 4
        f(5) = f(4) + 5
        ...
        f(n) = f(n-1)+n
 */
public class DiguiDemo1 {
    public static void main(String[] args) {
        int sum = getSum(5);
        System.out.println(sum);
    }

    //求n以内的和
    public static int getSum(int n) {
        if (n == 1) {
            return 1;
        } else {
            return getSum(n - 1) + n;
        }
    }
}

递归求斐波那契数列

/*
   需求:求斐波那契数列中的第n个数是多少?
        1   1   2   3   5   8   13  21  34  55....
   规律:
        第一个数和第二个数都是1
        从第三个数开始,每一个数字是前面两个数字之和

   假设:f(n)表示数列中的第n个数的值
        f(1) = 1
        f(2) = 1
        f(3) = f(1)+f(2)
        f(4) = f(2)+f(3)
        ...
        f(n) = f(n-2)+f(n-1)
 */
public class DiguiDemo2 {
    public static void main(String[] args) {

        int num = getNum(10);
        System.out.println(num);
    }

    //求斐波那契数列的第n个数
    public static int getNum(int n) {
        if(n==1 || n==2){
            return 1;
        }else{
            return getNum(n-2) + getNum(n-1);
        }
    }
}

println(num);
}

//求斐波那契数列的第n个数
public static int getNum(int n) {
    if(n==1 || n==2){
        return 1;
    }else{
        return getNum(n-2) + getNum(n-1);
    }
}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值