排序(冒泡/快速/归并)

news2024/11/20 1:36:57

冒泡排序

  • 时间复杂度为 O(n^2)

  • 原理

    1. 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.
    2. 依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的
    3. 重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]
    4. 持续对越来越少的元素进行如上步骤 , 直到没有任何一对数字需要比较
  • 核心代码

public static void bubbleSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			for(int j=0;j<arr.length-i-1;j++) {	//每次都少排最后一个
				if(arr[j]>arr[j+1]) {	//把大的往后放
					int t = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = t;
				}
			}
		}
	}

快速排序

  • 归并排序和快速排序都是基于“分而治之”的算法思想
public static int[] qSort(int arr[],int start,int end){
    int pivot = arr[start];    //一般定义arr数组的首元素为key值
    int i = start;   
    int j = end;
    while(i<j){
        //从左往右找,直到找到一个大于等于key值的
        while(i<j && arr[i]<pivot){
            i++;        
        } 
        //从右往左找,直到找到一个小于等于key值的
        while(i<j && arr[j]>pivot){
            j—-;        
        }   
        if(i<j && arr[i]==arr[j]){    //如果两值相等,那么令左侧指针继续向后移
            i++;        
        }else{    //如果两值不同,就交换两值
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;        
        }
    }
    if(i-1>start) arr=qSort(arr,start,i-1);    //递归,将小于key值的那些排序。并将这部分排完序的数组(原数组的一部分)赋值给原数组
    if(j+1<end) arr=qSort(arr,j+1,end);        //递归,将大于key值的那些排序。同上
    return arr;
}

归并排序

  • 时间复杂度 :O(nlogn)
  • 速度仅次于快速排序
    归并 就是先将带排序的数组不断拆分,指导拆分到只剩一个元素的时候,这时我们再把他们合并为两个有序的数组,得到长度更长的有序数组。然后,按照这样的思路,一层一层的合并,直到整个数组有序。
  • 怎么合并?
    要借助一个和原数组等长的新数组(这也是个典型的 以空间换时间的 做法)
    在这里插入图片描述
    在这里插入图片描述
// import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        int[] arr = {1,4,3,7,14,6,10};
        // System.out.println(Arrays.toString(arr));
        sortArray(arr);
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }

//归并排序的入口
    public static int[] sortArray(int[] arr){
        //定义一个辅助数组temp
        int[] temp = new int[arr.length];
        //进行归并排序
        mergeSort(arr,0,arr.length-1,temp);
        //返回排好序的原数组
        return arr;
    }

//归并排序

//实现归并的'分'
    public static void mergeSort(int[] arr,int left,int right,int[] temp){
        //如果只有一个元素,就不需要继续划分(只有一个元素的区间,本来就是有序的)
        // if(left == right) return;
        //当left < right 说明该区间是由一组数组成,需要继续划分
        if(left < right){
            int mid = (left+right)/2;   //这段区间的中值,用来划分左右区域
            mergeSort(arr, left, mid, temp);    //递归划分左半区
            mergeSort(arr, mid+1, right, temp); //递归划分右半区
            //合并已经排序的部分(左半区和右半区)(从只有一个元素的区间开始)
            merge(arr,left,mid,right,temp);
        }
    }
//实现归并的'合'
//arr是原数组;left是左半区的起始位置;mid是左半区的结束位置;right是右半区的结束位置;temp是辅助数组
    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;   //左半区的起始位置
        int j = mid+1;  //右半区的起始位置
        int k = left; //辅助数组的位置索引

        //合并
        //在左半区的位置索引范围内,和右半区的位置索引范围内,比较左右半区对应索引位置得的数值的大小,小的先放入temp数组中
        while(i<=mid && j<=right){
            //用三元运算符 更简洁 和下面的if else语句一个意思
            temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
            /*
            if(arr[i]<arr[j])   //左半区剩余第一个元素更小
                temp[k++] = arr[i++];   //意思是:先让temp[h] = arr[i];再让k++,i++;
            else                //右半区剩余第一个元素更小
                temp[k++] = arr[j++];
            */
        }

        //合并剩余元素(当其中一个半区的位置索引结束时,另一个半区可能还有剩余有序的元素--》直接合并到temp数组中即可)
        //合并左半区剩余元素
        while(i <= mid)
            temp[k++] = arr[i++];
        while(j <= right)
            temp[k++] = arr[j++];
        
        //temp数组 复制回 arr数组
        // for(int q=0;q<temp.length;q++){
            // arr[q] = temp[q];
        // }
        while(left <= right){
            arr[left] = temp[left];
            left++;
        }
    }
}

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

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

相关文章

如何备考2025年AMC8竞赛?吃透2000-2024年600道真题(免费送题)

最近有家长朋友问我&#xff0c;现在有哪些类似于奥数的比赛可以参加&#xff1f;我的建议可以关注下AMC8的竞赛&#xff0c;类似于国内的奥数&#xff0c;但是其难度要比国内的奥数低一些&#xff0c;而且比赛门槛更低&#xff0c;考试也更方便。比赛的题目尤其是应用题比较有…

NIO与AIO

NIO与AIO NIO模型 在 LInux 环境中&#xff0c;java.nio.channels.Selector 的子类叫做 sun.nio.ch.EPollSelectorImpl &#xff0c;其底 层是基于 Epoll 模型去实现的 IO 多路复用器。 对于 Epoll 模型 我们需要了解到它底层的三个函数 在 JDK 实现的底层中&#xff0c;EPol…

git clone没有权限的解决方法

一般情况 git clone时没有权限&#xff0c;一般是因为在代码库平台上没有配置本地电脑的id_rsa.pub 只要配置上&#xff0c;一般就可以正常下载了。 非一般情况 但是也有即使配置了id_rsa.pub后&#xff0c;仍然无法clone代码的情况。如下 原因 这种情况是因为ssh客户端…

Codigger用户篇:安全、稳定、高效的运行环境(一)

在当今数字化时代&#xff0c;个人数据的安全与隐私保护显得尤为重要。为了满足用户对数据信息的安全需求&#xff0c;我们推出Codigger分布式操作系统&#xff0c;它提供了一个运行私有应用程序的平台&#xff0c;旨在为用户提供一个安全、稳定、高效的私人应用运行环境。Codi…

对谈Concured首席技术官:利用AI和MongoDB打造个性化内容推荐系统

Built with MongoDB 栏目采访了AI初创企业Concured在成立约一年后加入的首席技术官 Tom Wilson&#xff0c;围绕 Concured 的人工智能使用情况、Wilson 加入团队的过程、坚持选择MongoDB的原因以及公司未来发展展开讨论。 关于Concured 内容无处不在。无论消费者寻找什么或所处…

【Effective Web】html/css优化和技巧

html/css优化和技巧 html/css可以做到一些js的功能&#xff0c;减少js操作dom的高昂成本。 巧用伪类 显示勾选时文案 checkbo勾选时触发&#xff0c;实现checkbox的简单选中事件处理 <template><input type"checkbox" /><span class"checkb…

最优算法100例之07-数组中只出现一次的数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 一个整型数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。 题解报告 最优解法…

Java框架安全篇--Shiro-550漏洞

Java框架安全篇--Shiro-550漏洞 Shiro反序列化源码可以提取&#xff1a; https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 JAVA反序列化就不说了&#xff0c;可以参考前面文章 https://blog.csdn.net/m0_63138919/article/details/136751184 初始Apache Sh…

VOC(客户之声)赋能智能家居:打造个性化、交互式的未来生活体验

随着科技的飞速发展&#xff0c;智能家居已成为现代家庭不可或缺的一部分。然而&#xff0c;如何让智能家居更好地满足用户需求&#xff0c;提供更贴心、更智能的服务&#xff0c;一直是行业关注的焦点。在这个背景下&#xff0c;VOC&#xff08;客户之声&#xff09;作为一种用…

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解&#xff0c;并且每个知识点基本都会有例子演示&#xff0c;详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前&#xff0c;我们要先知道spring框架在开发时&#xff0c;服务器端采用三层架构的方…

Amuse:.NET application for stable diffusion

目录 Welcome to Amuse! Features Why Choose Amuse? Key Highlights Paint To Image Text To Image Image To Image Image Inpaint Model Manager Hardware Requirements Compute Requirements Memory Requirements System Requirements Realtime Requirements…

集成ES分组查询统计求平均值

前言 之前其实写过ES查询数据&#xff0c;进行分组聚合统计&#xff1a; 复杂聚合分组统计实现 一、目标场景 机房机柜的物联网设备上传环境数据&#xff0c;会存储到ES存到ES的温湿度数据需要查询&#xff0c;进行分组后&#xff0c;再聚合统计求平均值 二、使用步骤 1.引入…

移动端Web笔记day03

移动 Web 第三题 01-移动 Web 基础 谷歌模拟器 模拟移动设备&#xff0c;方便查看页面效果&#xff0c;移动端的效果是当手机屏幕发生了变化&#xff0c;页面和页面中的元素也要跟着等比例变化。 屏幕分辨率 分类&#xff1a; 硬件分辨路 -> 物理分辨率&#xff1a;硬件…

《机器学习:引领数字化时代的技术革命》

随着科技的不断发展&#xff0c;机器学习作为人工智能的重要支柱之一&#xff0c;正迅速崛起并引领着数字化时代的技术革命。本文将从机器学习的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势预测和学习路线等方面展开探讨&#xff0c;为您揭示机器学习的神…

c++的学习之路:3、入门(2)

一、引用 1、引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 怎么说呢&#xff0c;简单点理解就是你的小名&#xff0c;家里人叫你小名&#…

配置DNS后,SSH登录变慢

问题描述 最近使用ssh时出现登录非常缓慢的状态&#xff0c;登录一般需要花费20秒以上才能正常登陆&#xff0c; Connecting to *****:22... Connection established. To escape to local shell, press CtrlAlt].等待十秒钟后&#xff0c;提示登录成功 Last login: Mon Jun …

k8s系列之十七 Istio中的服务治理

删除前面配置的目的地规则 [rootk8s-master ~]# kubectl delete destinationrule details destinationrule.networking.istio.io "details" deleted [rootk8s-master ~]# kubectl delete destinationrule productpage destinationrule.networking.istio.io "pr…

00000基础搭建vue+flask前后端分离项目

我完全是参考的这个vue3flask前后端分离环境速建_flask vue3-CSDN博客 安装了node_js&#xff08;添加了环境变量&#xff09; 环境变量 把原来的镜像源换成了淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 查看版本证明安装成功 npm - v 安装npm i…

caffe | 使用caffe SSD制作VOC07112 lmdb数据集

git clone -b ssd https://github.com/weiliu89/caffe.git caffe_ssdcd caffe_ssdcp caffe/Makefile.config caffe_ssd/# 把 cuda 和 cudnn 关了&#xff0c;用 cpu 版本的就好了 make -j32 make pycaffemake test -j8 make runtest -j8 vim ~/.bashrc# 加入 export LD_LIBRAR…

Day49:WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行

目录 文件-解析方案-目录执行权限&解码还原 目录执行权限 解码还原 文件-存储方案-分站存储&OSS对象 分站存储 OSS对象存储 知识点&#xff1a; 1、文件上传-安全解析方案-目录权限&解码还原 2、文件上传-安全存储方案-分站存储&OSS对象 文件-解析方案-目…