day044:数组的高级操作(二):冒泡排序、递归、快速排序

55 篇文章 0 订阅
3 篇文章 0 订阅

接上节:day043:数组的高级操作_ZQyyds:)的博客-CSDN博客

二、冒泡排序

1.什么是冒泡排序?

相邻的数据两两比较,小的放前面,大的放后面

2.冒泡排序规律

  • 如果有n个数据排序,则需要比较n-1次
  • 每一次比较完毕,下一次比较都会减少一个数据

代码示例:

package com.itheima;

/*冒泡排序代码优化*/
public class BubbleSortDemo2 {
    public static void main(String[] args) {
        int[] arr = {3, 5, 2, 1, 4};
        bubbleSort(arr);
        printArr(arr);
    }

    private static void bubbleSort(int[] arr) {
        /*改字母快捷键:选中,shift+F6
         快速抽取成方法的快捷键:CTRL+alt+M*/
        /*注:外循环是记录比较次数,内循环是相邻的两数据作比较
         * 内循环的arr.length - 1 - i中的-i是因为每次比较之后都会少一个数字*/
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    private static void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

三、递归

1.什么是递归?

递归概述:从编程的角度说,递归指的是方法定义中调用方法本身的现象

2.递归解决问题的思路:

把一个复杂的问题层层转化为一个与原问题相似的且规模较小的问题来求解

3.递归解决问题要找的两个内容

  • 递归出口:否则会出现内存溢出
  • 递归规则:与原问题相似的规模较小的问题

代码示例:

(1)递归求和:

//递归求1-100的和
public class Factorial_Demo1 {
    public static void main(String[] args) {
        int sum = getSum(100);
        System.out.println(sum);
    }

    private static int getSum(int i) {
        //代码解释:当i等于1时,返回值为1,代表已经加到最后的数1了;否则就返回当前数加上当前数减一
        //也就是说,i=100,返回100加上getSum(99),然后再调用getSum(99),以此类推...
        if (i == 1) {
            return 1;
        } else {
            return i + getSum(i - 1);
        }

    }
}

(2)递归求阶乘:

//递归求阶乘
public class Factorial_Demo2 {
    public static void main(String[] args) {
        int num = getJc(5);
        System.out.println(num);
    }

    private static int getJc(int i) {
        if (i == 1) {
            return 1;
        } else {
            return i * getJc(i - 1);
        }

    }


}

四、快速排序

1.快速排序和冒泡排序的区别

  • 冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
  • 快速排序算法中,每一次递归时以第一个数为基准数,找到数组中比基准数小的,再找到数组中比基准数大的,小的全部放左边,大的全部放右边,确定基准数的位置(基准数归位)。(快速排序在第一次递归后能确定的事情:小的数在基准数左边,大的数在基准数右边,以及基准数的位置)

 代码示例:

public class QuiteSort_demo2 {
    public static void main(String[] args) {
        int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
//        创建方法传入三个参数:数组,数组起始,数组结束
        quiteSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    private static void quiteSort(int[] arr, int left, int right) {
        if (right < left) {
            return;
        }
        //先做一个临时存储,因为后面要用到这两个数一开始位置的值
        int left0 = left;
        int right0 = right;
        //计算出基准数
        int baseNumber = arr[left0];
        while (left != right) {
            //1.从右开始找比基准数小的
            while (arr[right] >= baseNumber && right > left) {
                right--;
            }
            //2.从左开始找比基准数大的
            while (arr[left] <= baseNumber && right > left) {
                left++;
            }
            //3.交换两个值的位置
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
        //基准数归位:
        int temp = arr[left];
        arr[left] = arr[left0];
        arr[left0] = temp;

        quiteSort(arr, left0, left - 1);
        quiteSort(arr, left + 1, right0);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZQyyds:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值