算法学习01-选择、冒泡、插入排序

2023-11-18

1、选择排序

/*
    选择排序
    0到n-1位置,找到最小值,放到0位置;
    1到n-1位置,找到最小值,放到1位置;
    i到n-1位置,找到最小值,放到i位置;
    以此类推;
 */
public class SelectionSort {

    public static void main(String[] args) {
        // 测试一下 swap方法
//        int[] arr = {4, 3, 2};
//        printArray(arr);
//        swap(arr, 0, 1);
//        printArray(arr);


//        int[] arr = {7, 5, 6, 3};
//        printArray(arr);
//        selectionSort(arr);
//        printArray(arr);

        // 搞个对数器
        int testTimes = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArr(arr1);
            selectionSort(arr1);
            Arrays.sort(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
                break;
            }
        }
        System.out.println(succeed ? "Yes!!!" : "No!!!");

    }

    private static boolean isEqual(int[] arr1, int[] arr2) {
        if (arr1 == null && arr2 != null) {
            return false;
        }
        if (arr1 != null && arr2 == null) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }

        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }

    private static int[] copyArr(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }


    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int size = (int) (Math.random() * (maxSize + 1));
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
        }
        return arr;
    }


    public static void selectionSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            int minIndex = i;
            for (int j = i + 1; j < len; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            swap(arr, i, minIndex);
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void printArray(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int value : arr) {
            System.out.print(value + " ");
        }
        System.out.println();
    }

}

2、冒泡排序

/*
    冒泡排序:
    一个数组中的数,两两进行比较,较大的数字放到最后,跟气泡从水中冒出来一样,故称冒泡排序。
    bubble
    bubbling
    0到n-1位置,0~1 1~2 2~3 ... n-2~n-1两两相比较,找到最大值,放到n-1位置;
    0到n-2位置,0~1 1~2 2~3 ... n-3~n-2两两相比较,找到最大值,放到n-2位置;
    0到i位置,0~1 1~2 2~3 ... i-1~i两两相比较,找到最大值,放到i位置;
    以此类推;
 */
public class BubblingSort {

    public static void main(String[] args) {
//        int[] arr = {5, 0, 7, 8};
//        printArray(arr);
//        bubbleSort(arr);
//        printArray(arr);

        int testTimes = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArr(arr1);
            bubbleSort(arr1);
            Arrays.sort(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
            }
        }
        System.out.println(succeed ? "Yes!!!" : "No!!!");
    }

    private static boolean isEqual(int[] arr1, int[] arr2) {
        if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }

    private static int[] copyArr(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    private static int[] generateRandomArray(int maxSize, int maxValue) {
        int len = (int) (Math.random() * (maxSize + 1));
        int[] arr = new int[len];
        for (int i = 0; i < len; i++) {
            arr[i] = (int) (Math.random() * maxValue + 1) - (int) (Math.random() * maxValue);
        }
        return arr;
    }

    private static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }


    private static void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i >= 0; i--) {
            for (int j = 1; j <= i; j++) {
                if (arr[j] < arr[j - 1]) {
                    swap(arr, j, j - 1);
                }
            }
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

3、插入排序

/*
    插入排序:
    先保证0~0范围上有序
    先保证0~1范围上有序
    先保证0~2范围上有序
    以此类推

    该课程在新手班第一节课【01:51:57 开始讲】
 */
public class InsertionSort {

    public static void main(String[] args) {
        int testTimes = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArr(arr1);
            insertionSort(arr1);
            Arrays.sort(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                printArray(arr1);
                printArray(arr2);
                break;
            }
        }
        System.out.println(succeed ? "Yes!!!" : "No!!!");
    }

    public static void insertionSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }

        /*
            该段内容在新手班第一节课【01.58.37】
            0 ~ 0 完成
            0 ~ 1
            0 ~ 2
            0 ~ 3
            这里变化的是结尾,所以可以用参数end表示
         */
        for (int end = 1; end < arr.length; end++) {
            // 新来的数会在end位置上
            int newNumIndex = end;
            /*
                end - 1 >= 0 说明end左边有数
                arr[end - 1] > arr[end] 说明需要交换
             */
//            while (end - 1 >= 0 && arr[end - 1] > arr[end]) {
//                swap(arr, end - 1, end);
//            }

            // 把end替换成newNumIndex
            while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
                swap(arr, newNumIndex - 1, newNumIndex);
                // 交换后,往左移动一位,继续比较
                newNumIndex--;
            }
        }
    }

    private static int[] copyArr(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }


    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int size = (int) (Math.random() * (maxSize + 1));
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
        }
        return arr;
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void printArray(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int value : arr) {
            System.out.print(value + " ");
        }
        System.out.println();
    }

    private static boolean isEqual(int[] arr1, int[] arr2) {
        if (arr1 == null && arr2 != null) {
            return false;
        }
        if (arr1 != null && arr2 == null) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }

        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法学习01-选择、冒泡、插入排序 的相关文章

随机推荐

  • feign和ribbon有什么区别

    ribbon和feign都是用于调用其他服务的 不过方式不同 1 启动类使用的注解不同 ribbon用的是 RibbonClient feign用的是 EnableFeignClients 2 服务的指定位置不同 ribbon是在 Ribb
  • 【ssh】xshell的替代--WindTerm

    目录 WindTerm WindTerm 简介 如何关闭锁屏密码 3 功能 3 1 选中自动复制 右键粘贴复制的内容 3 2 打开软件自动连接 3 4 设置文件下载初始目录 4 可直接编辑bash命令行 5 界面管理 资源管理器 文件管理器
  • C++中struct的用法

    废话 struct是个很有用的东西呢 进入正题 struct的用处是定义一个新的类型 而这个类型里面可以是各种各样的东西 比如 struct node 定义一个新的类型叫node int a int b 110 char c double
  • ARM - UART4/串口软件实现字符串/字符的收发

    实验任务 1 在键盘输入一个字符 字符 1 并且打印在串口工具上 键盘输入 a gt 串口工具打印 b 2 串口工具输入一个字符串 按下回车键 会显示输入的字符串 头文件 ifndef UART4 H define UART4 H incl
  • 《MySQL是怎样运行的》——读书笔记

    MySQL是怎样运行的 小孩子4919 MySQL B 树 1 数据页 数据页之间双向链接 数据页内record单向链表 数据页内record分为多个组 每个组的最大记录组成数据槽 数据槽采用数组方式在页内存储 2 索引 索引记录为页的最小
  • nacos 安装并配置外部数据库

    参考链接 nacos 安装并配置外部数据库 亲测2 0 1 2 0 3 有效 zwb 121 博客园 Nacos 快速开始 下载链接 https github com alibaba nacos releases 启动服务器 Linux U
  • RocketMQ 消息过滤

    1 简介 RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件 是在Consumer端订阅消息时 再做消息过滤的 RocketMQ这么做是在于其Producer端写入消息和Consumer端订阅消息采用分离存储的机制来实 现的
  • 拉格朗日函数(多个约束条件的极值问题)

  • Jetpack DataBinding(数据绑定库)笔记

    官方文档地址 https developer android google cn topic libraries data binding 作用或目的 将数据直接绑定到布局里面 减少了Activity Fragment的绑定控件操作 听说有
  • Nodejs net 接受包 并解码,第一次使用了 protobuf

    第一次使用 net 模块的 buffer 类型 对 buffer copy 开始不了解 走了弯路 调用的对象是 sourece 一直以为是 dest 对包进行分割 包的结构为 包内容长度 byte0 byte1 包内容 protobuf a
  • MacBook Pro 外接显示器设置竖屏

    调整步骤 系统设置偏好 gt 显示器 gt 点击排列 gt 镜像显示器 的 打上 然后切换回 显示器 此分类 gt 看到下面 的旋转了么 调整旋转90度 转自 http uiq me article 380
  • 用lingo解决易拉罐下料问题

    易拉罐下料问题 如下 程序如下 这里的xi 以万次为单位 yi 以万件为单位 model 易拉罐下料问题 max 0 100 y1 0 2226 x1 0 1833 x2 0 2618 x3 0 1695 x4 0 1571 y2 0 01
  • k8s集群搭建【1个master_1个node】 亲测成功!

    k8s集群搭建 k8s 1个master 1个node 集群搭建 步骤小结 1 安装docker 2 安装kubeadm kubectl kubelet 3 创建master节点的集群 并安装网络插件calico 4 添加node节点到集群
  • 在group by中用count(*)获取的是各个分组的条数

    第一种 在group by 中用count 获取条数 你会很神奇的发现你获取的 不是总条数 而是每个组的条数 这很有作用 但是如果你要获取总条数的话就会很麻烦 我在网上搜了说用子查询 select count 1 from select f
  • 脉冲信号参数测量仪

    脉冲信号参数测量仪 1 任务 设计并制作一个数字显示的周期性矩形脉冲信号参数测量仪 其输入阻抗为50 同时设计并制作一个标准矩形脉冲信号发生器 作为测试仪的附加功能 2 要求 1 测量脉冲信号频率 频率范围为10Hz 2MHz 测量误差的绝
  • Java设计模式——状态模式

    定义 状态模式主要用来解决对象在多种状态转换时 需要对外输出不同的行为的问题 状态模式将每个状态的行为封装到对应的一个类中方便维护 减少if else 符合 开闭原则 容易增删状态 但是会产生很多类 每个状态都要一个对应的类 当状态过多时会
  • jenkins修改镜像源

    进入 Manage Jenkins Manage Plugin gt Advanced 最下面有 Update Site 设置为 http mirrors tuna tsinghua edu cn jenkins updates updat
  • 你遇到过的测试难题(6)记一次xxl-job的故障失败没有重试机制

    你遇到过的测试难题 6 记一次xxl job的故障失败没有重试机制 你遇到过的测试难题 6 记一次xxl job的故障失败没有重试机制 业务背景 线上故障表现 故障结论 测试过程 总结 你遇到过的测试难题 6 记一次xxl job的故障失败
  • neo4j start error:系统找不到指定的路径。 Unable to create logger at ‘‘

    项目场景 Neo4j 4 3 3 community windows 这是代码文件 启动时需要进入文件夹下的bin目录 输入neo4j start 然后转入http localhost 7474 出现可供使用的图形界面 此时如果在当前目录下
  • 算法学习01-选择、冒泡、插入排序

    1 选择排序 选择排序 0到n 1位置 找到最小值 放到0位置 1到n 1位置 找到最小值 放到1位置 i到n 1位置 找到最小值 放到i位置 以此类推 public class SelectionSort public static vo