冒泡排序与快速排序


 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

关注博主带你了解更多数据结构知识


1.冒泡排序

冒泡排序

private static void swap(int[] arrary,int i,int j){
        int tmp = arrary[i];
        arrary[i] = arrary[j];
        arrary[j] = tmp;

public static void  bubbleSort(int[] arrary){
        for (int i = 0; i <arrary.length-1 ; i++) {
            for (int j = 0; j < arrary.length-1-i; j++) {
                if(arrary[j]> arrary[j+1]){
                    swap(arrary,j,j+1);
                }

            }
        }
        return arrary;
    }

冒泡排序总结

1. 冒泡排序是一种非常容易理解的排序

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:稳定 

2.快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元 素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有 元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

1.Hoare版

public static void  quickSort(int[] arrary){
        quick(arrary,0,arrary.length-1);
        return arrary;

    }
    private static void swap(int[] arrary,int i,int j){
        int tmp = arrary[i];
        arrary[i] = arrary[j];
        arrary[j] = tmp;
    private static void quick(int [] arrary,int start,int end){
        if (start >= end) {
            return;
        }
        int par = partition(arrary,start,end);
        quick(arrary,start,par-1);
        quick(arrary,par+1,end);
    }
    private static int partition(int [] arrary,int left,int right){
        int i = left;
        int tmp = arrary[left];
        while (left < right){
            //right-- : 先走左边会导致最后相遇的地方比基准大的数据,
            // 交换完后,会把大于基准的值换到前面
            while (left < right && arrary[right] >= tmp){
                right--;
            }
            while (left < right && arrary[left] <= tmp){
                left++;
            }
            swap(arrary,left,right);
        }
        //此时相遇left=right;
        swap(arrary,left,i);
        return right;
    }

2.挖坑法 

public static void  quickSort(int[] arrary){
        quick(arrary,0,arrary.length-1);
        return arrary;

    }
private static void quick(int [] arrary,int start,int end){
        if (start >= end) {
            return;
        }
        int par = partitionWaken(arrary,start,end);
        quick(arrary,start,par-1);
        quick(arrary,par+1,end);
    }
private static int partitionWaken(int [] arrary,int left,int right){
        int tmp = arrary[left];
        while (left<right){
            while (left < right && arrary[right] >= tmp){
                right--;
            }
            arrary[left] = arrary [right];
            while (left<right && arrary[left] <= tmp){
                left++;
            }
            arrary[right] = arrary[left];
        }
        arrary[left] = tmp;
        return left;
    }

3.快速排序优化

1. 三数取中法选key


 public static void  quickSort(int[] arrary){
        quick(arrary,0,arrary.length-1);
return arrary;

    }
    private static void quick(int [] arrary,int start,int end){
        if (start >= end) {
            return;
        }

        int index = midThreeNum(arrary,start,end);
        swap(arrary,index,start);

        int par = partitionWaken(arrary,start,end);
        quick(arrary,start,par-1);
        quick(arrary,par+1,end);
    }

private static int partitionWaken(int [] arrary,int left,int right){
        int tmp = arrary[left];
        while (left<right){
            while (left < right && arrary[right] >= tmp){
                right--;
            }
            arrary[left] = arrary [right];
            while (left<right && arrary[left] <= tmp){
                left++;
            }
            arrary[right] = arrary[left];
        }
        arrary[left] = tmp;
        return left;
    }
    private static int midThreeNum(int [] arrary,int left,int right){
        int mid = (left+right)/2;
        if (arrary[left] < arrary[right]){
            if (arrary[mid] < arrary[left]) {
                return left;

            }else if (arrary[mid] > arrary[right]){
                return right;
            }else {
                return mid;
            }
        }else{
            if (arrary[mid] < arrary[right]){
                return right;
            }else if(arrary[mid] > arrary[left]){
                return left;
            }else {
                return mid;
            }
        }
    }

2. 递归到小的子区间时,可以考虑使用插入排序

我们在数组中数据小于等于10时改为插入排序,提高了排序的效率.

 public static void  quickSort(int[] arrary){
        quick(arrary,0,arrary.length-1);
return arrary;

    }
    private static void quick(int [] arrary,int start,int end){
        if (start >= end) {
            return;
        }
        if (end - start + 1 <= 10) {
            inserSortRange(arrary,start,end);
            return;
        }

        int index = midThreeNum(arrary,start,end);
        swap(arrary,index,start);

        int par = partitionWaken(arrary,start,end);
        quick(arrary,start,par-1);
        quick(arrary,par+1,end);
    }
    public static  void inserSortRange(int [] array,int left,int right){
        for(int i = left+1; i< right;i++){
            int tmp = array[i];
            int j = i-1;
            for (; j >=0 ; j--) {
                if (array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    //array[j+1]= tmp;
                    break;
                }
            }
            array[j+1]= tmp;
        }
    }
 private static int partitionWaken(int [] arrary,int left,int right){
        int tmp = arrary[left];
        while (left<right){
            while (left < right && arrary[right] >= tmp){
                right--;
            }
            arrary[left] = arrary [right];
            while (left<right && arrary[left] <= tmp){
                left++;
            }
            arrary[right] = arrary[left];
        }
        arrary[left] = tmp;
        return left;
    }
    private static int midThreeNum(int [] arrary,int left,int right){
        int mid = (left+right)/2;
        if (arrary[left] < arrary[right]){
            if (arrary[mid] < arrary[left]) {
                return left;

            }else if (arrary[mid] > arrary[right]){
                return right;
            }else {
                return mid;
            }
        }else{
            if (arrary[mid] < arrary[right]){
                return right;
            }else if(arrary[mid] > arrary[left]){
                return left;
            }else {
                return mid;
            }
        }
    }

4.非递归的快速排序 

//非递归快速排序
 
    public static void quickNot(int[] array){
        Stack<Integer> stack = new Stack<>();
        int left = 0;
        int right = array.length - 1;
        int par = partition(array,left,right);
        if (par > left+1){
            stack.push(left);
            stack.push(par-1);

        }
        if (par < right-1){
            stack.push(par+1);
            stack.push(right);
        }
        while (!stack.isEmpty()){
            right = stack.pop();
            left = stack.pop();
            par = partitionWaken(array,left,right);
            if(par > left+1){
                stack.push(left);
                stack.push(par-1);
            }
            if (par < right -1){
                stack.push(par+1);
                stack.push(right);
            }
        }
         return array;
    }
private static int partition(int [] arrary,int left,int right){
        int i = left;
        int tmp = arrary[left];
        while (left < right){
            //right-- : 先走左边会导致最后相遇的地方比基准大的数据,
            // 交换完后,会把大于基准的值换到前面
            while (left < right && arrary[right] >= tmp){
                right--;
            }
            while (left < right && arrary[left] <= tmp){
                left++;
            }
            swap(arrary,left,right);
        }
        //此时相遇left=right;
        swap(arrary,left,i);
        return right;
    }

未优化的快速排序,再遇到数据过多时,程序会崩. 

1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序

2. 时间复杂度:O(N*logN)

快速排序和堆排序时间复杂度一样,但是快速排序要比堆排序快

3. 空间复杂度:O(logN)

4. 稳定性:不稳定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[docker] docker 安全知识 - docker api, 权限提升 资源管理

[docker] docker 安全知识 - docker api, 权限提升 & 资源管理 这是 docker 安全的最后一篇 暴露 docker api 在 [docker] docker 安全知识 - docker 系统性简介 中曾经提到&#xff0c;docker cli 使用 restful api 与客户端和 docker daemon 之间交流。默认情况下&…

国内的期权模拟账户怎么申请?

国内的期权模拟账户可以在券商和期权分仓平台处申请开通&#xff0c;期权相比于股票具有杠杆投资、风险控制等新特性。 期权模拟交易客户端能够提供期权的开平仓交易、备兑开仓&#xff0f;平仓、行权等交易指令&#xff0c;下文为大家介绍国内的期权模拟账户怎么申请&#xff…

安卓模拟键盘蓝牙电脑apk

蓝牙连接电脑就可以使用了。 下载地址&#xff1a;点击下载https://download.csdn.net/download/jasonhongcn/89382597

【基础算法总结】模拟算法

模拟算法 1.替换所有的问号2.提莫攻击3.Z 字形变换4.外观数列5.数青蛙 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 模拟算法 —> 比葫芦…

npm发布、更新、删除包

如何将自己开发的依赖包发布到npmjs上供别人使用&#xff1f;五个步骤搞定&#xff01; 实现步骤&#xff1a; 创建自己的工具包项目&#xff0c;进行开发。注册npmjs账号。执行npm login在控制台登录&#xff0c;填写用户信息。执行npm publish发布包。更新及删除。 步骤一…

Leetcode - 周赛399

目录 一&#xff0c;3162. 优质数对的总数 I 二&#xff0c;3163. 压缩字符串 III 三&#xff0c;3164. 优质数对的总数 II 四&#xff0c; 3165. 不包含相邻元素的子序列的最大和 一&#xff0c;3162. 优质数对的总数 I 假设 x 是 nums1 数组中的值&#xff0c;y 是 nums2…

Docker部署SiYuan笔记-Unraid

使用unraid的docker部署SiYuan笔记&#xff0c;简单记录 笔记说明 Siyuan笔记是一款基于markdown语法的笔记工具&#xff0c;具有活跃的社区和多设备支持。大部分功能都是免费&#xff0c;源代码开源&#xff0c;支持插件安装&#xff0c;具有很不错的使用体验。 Docker地址&a…

【应用层】 DNS 域名协议解析

文章目录 DNS(Domain Name System)出现及演化 ⏳DNS 概括&#x1f50d;DNS定义DNS 作用 DNS工作原理⚙️域名解析DNS解析的详细工作流程 DNS域名解析方式&#x1f504;静态DNS域名解析动态DNS域名解析 DNS域名解析过程的深入分析 &#x1f9d0;递归查询迭代查询 公共DNS服务器的…

Python 机器学习 基础 之 处理文本数据 【停用词/用tf-idf缩放数据/模型系数/多个单词的词袋/高级分词/主题建模/文档聚类】的简单说明

Python 机器学习 基础 之 处理文本数据 【停用词/用tf-idf缩放数据/模型系数/多个单词的词袋/高级分词/主题建模/文档聚类】的简单说明 目录 Python 机器学习 基础 之 处理文本数据 【停用词/用tf-idf缩放数据/模型系数/多个单词的词袋/高级分词/主题建模/文档聚类】的简单说明…

AI帮写:探索国内AI写作工具的创新与实用性

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

Keras深度学习框架实战(3):EfficientNet实现stanford dog分类

1、通过EfficientNet进行微调以实现图像分类概述 通过EfficientNet进行微调以实现图像分类&#xff0c;是一个使用EfficientNet作为预训练模型&#xff0c;并通过微调&#xff08;fine-tuning&#xff09;来适应特定图像分类任务的过程。一下是对相关重要术语的解释。 Effici…

【气象常用】剖面图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;我用的era5的散度数据&#xff08;大家替换为自己的就好啦&#xff0c;era5数据下载方法可以看这里【数据下载】ERA5 各高度层月平均数据下载_era5月平均数据-CSDN博客&#xff09; 2. 数据处理&#xff1a…

高考试卷押运车视频监控解决方案

一、引言 高考作为我国教育领域的重要事件&#xff0c;其公正、公平和安全性一直备受社会关注。试卷押运作为高考的重要环节&#xff0c;其安全性直接关系到高考的顺利进行和考生的切身利益。因此&#xff0c;对高考试卷押运车实施视频监控解决方案&#xff0c;对于确保试卷安…

【Pr学习】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher v1.5.0)

在不受支持的 Mac 上安装 macOS Sonoma (OpenCore Legacy Patcher v1.5.0) Install macOS on unsupported Macs 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主…

Hugging Face称检测到对其人工智能模型托管平台的“未经授权访问“

周五下午晚些时候&#xff0c;人工智能初创公司Hugging Face表示&#xff0c;其安全团队在本周早些时候检测到对Spaces的"未经授权访问"&#xff0c;Spaces是Hugging Face用于创建、共享和托管人工智能模型和资源的平台。 Hugging Face 在一篇博文中说&#xff0c;这…

intel深度相机D455的使用

一、D455介绍 Intel RealSense D455 是RealSense D400系列的一部分&#xff0c;这个系列的设备以其高精度和可靠性而闻名。D455相比于之前的型号&#xff08;如D415和D435&#xff09;&#xff0c;提供了更远的感知范围和更高的精度。 二、使用代码 我们先定义一下相关的函数…

深入理解Java中的List集合:解析实例、优化技巧与最佳实践

一&#xff1a;List 集合的基础 1.1 什么是 List 集合&#xff1f; List 集合是 Java 集合框架中的一种有序、可重复的数据结构&#xff0c;它继承自Collection 接口&#xff0c;允许存储多个元素。 与数组不同&#xff0c;List 集合的大小是动态可变的&#xff0c;可以根据…

Elasticsearch:基于多个 kNN 字段对文档进行评分

作者&#xff1a;来自 Elastic Madhusudhan Konda 通过具有多个 kNN 字段的最接近的文档对文档进行评分 Elasticsearch 不仅仅是一个词法&#xff08;文本&#xff09;搜索引擎。 Elasticsearch 是多功能搜索引擎&#xff0c;除了传统的文本匹配之外&#xff0c;还支持 k 最近…

海外高清短视频:四川京之华锦信息技术公司

海外高清短视频&#xff1a;探索世界的新窗口 在数字化时代的浪潮下&#xff0c;海外高清短视频成为了人们探索世界、了解异国风情的新窗口。四川京之华锦信息技术公司这些短视频以其独特的视角、丰富的内容和高清的画质&#xff0c;吸引了无数观众的目光&#xff0c;让人们足…