1.3 排序算法

news2024/11/17 23:56:36

在这里插入图片描述
在这里插入图片描述

1.1 冒泡排序

public class BubbleSort {
    public static void main(String[] args) {

        int[] arr = {133,322,13,444,54,621,174,18,19,2};
        System.out.println(Arrays.toString(arr));
        BubSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //冒泡排序
    public static void BubSort(int[] arr){
        //临时变量,存储较大元素
        int temp;
        //控制比较多少轮
        for(int i=0;i<arr.length;i++)
        {
            //控制比较次数
            for(int j=0;j<arr.length-1-i;j++)
            {
                if(arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}

1.2 快速排序

    //快速排序
    public static void QuiSort(int[] arr,int start,int end) {
        if (start < end) {
            //找到数组的标准数
            int stard = arr[start];
            //记录排序的下标
            int low = start;
            int high = end;
            while (low < high) {
                //如果右边数字大于标准数
                while (low < high && stard <= arr[high]) {
                    high--;
                }
                //如果右边数字小于标准数,需要替换左边的数字
                arr[low] = arr[high];
                //如果左边数字小于标准数字
                while (low < high && arr[low] <= stard) {
                    low++;
                }
                //如果右边数字大于标准数,需要替换右边的数字
                arr[high] = arr[low];
            }
            //标准数赋值
            arr[low] = stard;
            //System.out.println("第一次排序"+Arrays.toString(arr));
            //第一次已经排好,使用递归分开处理
            //处理所有小的数字
            QuiSort(arr, start, low);
            //处理所有大的数字
            QuiSort(arr, low+1, end);
        }
    }
}

1.3 插入排序

 public  static void insertSort(int [] arr){
        //遍历所有数字:从后往前比较
        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for(int i=1;i<arr.length;i++)
        {
            if(arr[i]<arr[i-1]){
                int temp=arr[i];
                int j;
                //遍历当前数字前面所有数字,如果前面数字大于后面数字temp,交换
                for(j=i-1;j>=0&&temp<arr[j];j--){
                    //把前一个数字赋给后一个数字
                    arr[j+1]=arr[j];
                    //方法二:
                    //arr[j]=temp;
                }
                //当比较到不小于temp的值:临时变量(外层for循环的当前元素)赋给不符合条件的后一个位置pos
                //方法一:
               arr[j+1]=temp;
            }
        }
    }

1.4 希尔排序

 public static void shellSort(int[] arr) {
        int k=1;
        //遍历所有步长
        for (int d = arr.length / 2; d > 0; d /= 2) {
            //遍历所有元素
            for (int i = d; i < arr.length; i++) {
                for (int j = i - d; j >= 0; j -= d) {  //比较的元素是j=j-d; 1 3 5 7
                    //如果当前元素大于加上步长的元素(从小到大)
                    if (arr[j] > arr[j + d]) {
                        //交换元素
                        int temp = arr[j];
                        arr[j] = arr[j + d];
                        arr[j + d] = temp;
                    }
                }
            }
            System.out.println("第" + k + "次排序后的数组" + Arrays.toString(arr));
            k++;
        }
    }

1.5 选择排序

   //选择排序
    public static void selectSort(int[]arr){
        //遍历所有数字
        for(int i=0;i<arr.length;i++){
            int minIndex=i;
            //当前遍历的数和后面的数字依次比较,记录最小数字的下标
            //寻找最小的元素下标
            for(int j=i+1;j<arr.length;j++){
                //如果后面比较的数比记录的最小数小
                if(arr[minIndex]>arr[j]){
                    //记录最小数的下标
                    minIndex=j;
                }
            }
            //如果最小的数和当前遍历数的下标不一样,说明后面下标为minIndex的数比当前遍历的数更小
            //交换数字
            if(i!=minIndex){
                int temp=arr[i];
                arr[i]=arr[minIndex];
                arr[minIndex]=temp;
            }
        }
    }

1.6 归并排序

public class MergeSort {
    public static void main(String[] args) {
        int[]arr=new int[]{1111,112,4,55,555,111,244,145};
        int mid=arr.length/2;
        mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    //归并排序:递归和合并
   public static  void mergeSort(int[] arr,int left,int right) {
        int mid=(left+right)/2;
        if(left<right){
            //处理左边
            mergeSort(arr,left,mid);
            //处理右边
            mergeSort(arr,mid+1,right);
            //归并操作:
            merge(arr,left,mid,right);
        }
    }

    //合并的方法:
    // a数组的的第i个 和b数组的第j个比较。 小的先进入
    public static void merge(int[] arr,int left,int mid,int right) {
        //用于存储归并后的临时数组
        int []temp=new int[right-left+1];
        //模拟分成两个数组:
        // 记录第一个数组中需要遍历的下标,[left,mid]
        int i=left;
        //记录第二个数组中遍历的下标   ,[mid+1,right]
        int j=mid+1;
        //用于记录临时数组中存放下标
        int index=0;
        //遍历两个数组
        while(i<=mid&&j<=right){
            //第一个数组的数据更小
            if(arr[i]<arr[j]){
                //放入小数据到临时数组中
                temp[index]=arr[i];
                i++;
            }else{
                temp[index]=arr[j];
                j++;
            }
            //放入元素后,index后移动
            index++;
        }

        //处理多余数据:a数组或者b数组中剩下元素的情况
        while(j<=right){
            temp[index]=arr[j];
            j++;
            index++;
        }
       //将数组arr中从索引为l到索引为mid的元素复制到临时数组temp中
        while (i<=mid){
            temp[index]=arr[i];
            i++;
            index++;
        }
        //临时数组中的数据重新存入原数组
        for(int k=0;k<temp.length;k++) {
            //从pos=low开始放入排序后的元素
            arr[left+k]=temp[k];
        }
    }
}

1.7 堆排序

先把数组中元素变为大顶堆(根节点大于子节点),再对大顶堆进行排序(取出大顶堆中的最上面元素,再对下面进行调整;对调整好的大顶堆再取出最上面的元素,一直重复)。

//堆排序:升序使用大顶堆
//降序使用小顶堆
//先把数组中元素变为大顶堆(根节点大于子节点),再对大顶堆进行排序


import java.util.Arrays;
import java.util.HashMap;

public class HeapSort {
    public static void main(String[] args) {
        int[]arr=new int[]{9,6,8,7,0,1,10,4,2};
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    //对调整好的大顶堆进行排序: 
    // 取出大顶堆中的最上面元素,再对下面进行调整;对调整好的大顶堆再取出最上面的元素,一直重复
    public static void heapSort(int []arr){
        //开始位置是最后一个非叶子节点,即最后一个节点的父节点
        int start=(arr.length-1)/2;
        //结束为止,数据长度-1
        //从最后一个非叶子节点从后往前进行调整
        for(int i=start;i>=0;i--){
            maxHeap(arr,arr.length,i);
        }
        //先把数组中的第0个和堆中的最后一个数字交换位置,再把前面的处理为大顶堆
        for(int i=arr.length-1;i>0;i--){
            int temp=arr[0];
            arr[0]=arr[i];
            arr[i]=temp;
            maxHeap(arr,i,0);
        }

    }


    //(1)大顶堆
    public static void maxHeap(int []arr,int size,int index){
        // 找到左孩子节点
        int lNode=2*index+1;
        //找到右孩子节点
        int rNode=2*index+2;
        int max=index;
        //和两个子节点分别对比,找出最大的节点
        if(lNode<size&&arr[lNode]>arr[max]){
            max=lNode;
        }
        if(rNode<size&&arr[rNode]>arr[max]){
            max=rNode;
        }
        //交换位置
        if(max!=index){
            int temp=arr[index];
            arr[index]=arr[max];
            arr[max]=temp;
            //交换位置后,对交换后的堆进行调整
            maxHeap(arr, size,max);
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1270422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

投资5亿英镑!英国启动五项新量子项目

​&#xff08;图片来源&#xff1a;网络&#xff09; 近日&#xff0c;英国财政大臣Jeremy Hunt宣布&#xff0c;英国政府将投资5亿英镑(即6.26亿美元)为英国研究人员和初创企业提供人工智能项目的算力支持。 Jeremy Hunt还详细介绍了政府计划推出的五项新研究计划&#xff0c…

国内传统企业数字化转型升级,有哪些成功案例?

近年来&#xff0c;涌现出了很多使用零代码平台撬动一线业务管理效率的案例&#xff0c;比如&#xff1a; 山东滨州长山镇政府&#xff1a;仅用3小时搭建出监管平台&#xff0c;成功助力辖区300企业返岗复工&#xff1b;纳曲酒业&#xff1a;搭建市场费用和订单联动管控平台&a…

虚拟机指定开放数据库3306端口

1、查看当前防火墙状态&#xff1a; sudo firewall-cmd --state 2、开放指定端口 sudo firewall-cmd --zonepublic --add-port3306/tcp --permanent 3、重新加载防火墙配置 sudo firewall-cmd --reload 4、检查端口是否开放成功 sudo firewall-cmd --zonepublic --list-por…

如何自定义spring-boot-starter

1. 创建自定义starter 1.1 生成Maven工程 mvn archetype:generate -DarchetypeGroupIdorg.apache.maven.archetypes -DarchetypeArtifactIdmaven-archetype-quickstart -DarchetypeVersion1.4交互式输入groupId、artificatId、version&#xff0c;生成Maven工程后用IDEA打开 …

Python精讲 | 条件赋值和and-or技巧

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 在之前的 一段奇葩的1024代码 中&#xff0c;有这么一个写法&#xff1a; 看上去是一个由 and 和 or 组成的逻辑表达式。但实际的效果却相当于一个 if-else 的条件判断&#xff1a; if i % 5 4:D \n else:D 为什…

【python+Excel】读取和存储测试数据完成接口自动化测试

http_request2.py用于发起http请求 #读取多条测试用例 #1、导入requests模块 import requests #从 class_12_19.do_excel1导入read_data函数 from do_excel2 import read_data from do_excel2 import write_data from do_excel2 import count_case #定义http请求函数COOKIENon…

我在Vscode学OpenCV 图像处理一(阈值处理、形态学操作【连通性,腐蚀和膨胀,开闭运算,礼帽和黑帽,内核】)

文章目录 一、阈值处理1.1 OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold()&#xff0c;用于实现阈值处理1.1.1. cv2.threshold()&#xff1a;(1)在函数cv2.threshold()中&#xff0c;参数threshold_type用于指定阈值处理的方式。它有以下几种可选的阈值类型…

认识并初步使用shell脚本

目录 一、什么是Shell脚本 二、变量与运算 三、逻辑判断 四、循环 五、函数 六、中断与继续 一、什么是Shell脚本 在前面学习了Linux的基本指令&#xff0c;而shell脚本其实就是是这些命令的集合。 那么为什么需要shell脚本呢&#xff1f; 因为可以用来实现一些复杂的操…

git丢弃本地操作,强制使用线上最新代码

借鉴&#xff1a;弃用本地分支所有代码&#xff0c;获取远程分支最新代码_git获取远程最新分支_小中.的博客-CSDN博客 1.问题:git pull结果发现本地仓库比线上代码提前l两个commit。本地未进行任何操作。需要直接使用线上最新代码。ps:Author都是某同事。 2.操作&#xff1a; …

旅游网站的技术SEO:技巧与最佳实践

技术SEO在旅游网站中的作用 旅游网站都是关于用户体验和参与度的。但是&#xff0c;在开始处理这些参数之前&#xff0c;您需要努力使用户登陆您的网站。这意味着你需要让你的网站在搜索引擎结果页面&#xff08;SERP&#xff09;中排名。 一旦你在搜索引擎结果中获得曝光&am…

什么是PDM图纸管理系统?PDM图纸管理系统主要功能有哪些?

PDM (Product Data Management) 图纸管理系统 是用于管理企业内部图纸和相关文件的软件系统。它提供了一个集中存储、组织和跟踪图纸和文件的平台&#xff0c;以确保团队成员能够轻松访问、共享和更新所需的工程设计和制造数据。 彩虹PDM系统|PDM产品数据管理系统|BOM管理|工艺…

记录仿钉钉审批流(将MySQL换成Oracle)走过的坑

需求&#xff1a;实现审批流程 在Gitee上发现了一个功能还OK的项目&#xff0c;于是就clone下来了&#xff08;如下图&#xff09; 原项目用MySQL很好启动&#xff0c;B站上作者还录制了视频&#xff0c;可以去学习 这里主要记录将MySQL换成Oracle出现的问题 首先&#xff0c…

详解API开发【电商平台API封装商品详情SKU数据接口开发】

1、电商API开发 RESTful API的设计 RESTful API是一种通过HTTP协议发送和接收数据的API设计风格。它基于一些简单的原则&#xff0c;如使用HTTP动词来操作资源、使用URI来标识资源、使用HTTP状态码来表示操作结果等等。在本文中&#xff0c;我们将探讨如何设计一个符合RESTfu…

Embassy 库下载代码示例

解决方案&#xff1a; swift import Embassy let downloader Downloader() // 使用代理主机和端口 downloader.useProxy(proxyHost: ") // 下载 URL 的内容 let content downloader.download(from: "") // 输出下载的内容 print(content) 这个程序首先…

STM32 Nucleo-64 boards 外设资源引脚对应关系图

STM32 Nucleo-64 boards 外设资源引脚对应关系图 1. STM32 NUCLEO-F103RB1.1 串口对应关系图1.2 I2C对应关系图【参考博文】1. STM32 NUCLEO-F103RB 1.1 串口对应关系图 1.2 I2C对应关系图 注意:STM32 NUCLEO-F103RB

清早送朋友的阳光早安问候语祝福,愿你好运同行

1、早上好&#xff01;送上清晨第一缕阳光&#xff0c;伴随着燕舞蝶飞的风声&#xff0c;给您最温馨的问候。让心情放飞&#xff0c;让梦想翱翔&#xff0c;让生命绽放。祝您每天都充满能量&#xff0c;前程似锦&#xff01; ​ 2、平凡就是幸福&#xff0c;简单就是快乐&…

塑料注塑件自动化光学测量蓝光自动化三维检测解决方案-CASAIM-IS(2ND)

一、背景介绍 在塑料制品的生产过程中&#xff0c;注塑件的质量对于产品的整体质量和性能至关重要。然而&#xff0c;通过使用三坐标、卡尺、千分尺等量具&#xff0c;对工件进行单点或人工检测其加工精度&#xff0c;对复杂形位公差检测目前比较难取得数据&#xff0c;无法快…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

基于three.js生成动态波浪背景效果

文章目录 前言一、安装three二、新建waves.js文件三、引入waves.js文件比查看效果如有启发&#xff0c;可点赞收藏哟~ 前言 基于three.js生成动态波浪背景效果 一、安装three npm i three -S二、新建waves.js文件 注意geometry.setAttribute和geometry.addAttribute和在不同…

一,vue3 解构 获取值 双向绑定 二。数据监听 双向绑定 三。冒泡排序

一&#xff0c;vue3 解构 获取值 双向绑定 <template><nav><!-- 按钮 --><!-- 绑定事件的弹框 v-on --><button click"submit">弹出</button><br><!-- 、双向绑定 --><input v-model"num" place…