【排序算法总结】

目录

  • 1. 稳点与非稳定排序
  • 2. 冒泡排序
  • 3. 简单选择排序
  • 4. 直接插入排序
  • 5. 快排
  • 6. 堆排
  • 7. 归并

在这里插入图片描述

1. 稳点与非稳定排序

  • 不稳定的:快排、堆排、选择
  • 原地排序:快排也是
  • 非原地排序:归并 和三个线性时间排序:桶排序 ,计数,基数

2. 冒泡排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
public class ReviewToo {
    //1.冒泡排序 时间复杂度 O(n*n)  空间复杂度 O(1) 稳定
    public int[] BubbleSort(int[] a) {
        int temp;//空间复杂度的体现
        boolean flag;
        o:
        for (int i = 1; i < a.length; i++) {
            flag = false;
            for (int j = 0; j < a.length - i; j++) {
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    flag = true;
                }
            }
            if (flag == false) {
                break o;
            }
        }
        return a;
    }

3. 简单选择排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 不稳定
    //2.简单选择排序 时间复杂度 O(n*n)  空间复杂度 O(1) 不稳定
    public int[] simpleSelectSort(int[] a) {
        int temp, min;//空间复杂度的体现
        for (int i = 0; i < a.length - 1; i++) {
            min = i;
            for (int j = i + 1; j < a.length; j++) {
                if (a[min] > a[j]) {
                    min = j;
                }
            }
            if (min != i) {
                temp = a[i];
                a[i] = a[min];
                a[min] = temp;
            }
        }
        return a;
    }

4. 直接插入排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
    //3.直接插入排序 时间复杂度 O(n*n)  空间复杂度 O(1)  稳定
    public int[] straightInsertionSort(int[] a) {
        //第一个元素是有序表 后面的是无序表 从后往前插
        for (int i = 1; i < a.length; i++) {
            int value = a[i];//要插入的元素
            int index = i - 1;//要插入的位置
            while (index >= 0 && value < a[index]) {
                if (value < a[index]) {
                    a[index+1]=a[index];
                    //索引前移继续找插入位置
                    index--;
                }
            }
            //循环结束找到了插入位置
            a[index+1]=value;
        }
        return a;
    }
 }

5. 快排

  • 时间复杂度 O(n* log n)
  • 空间复杂度 O(log n)
  • 不稳定
//4.快排;
// 时间复杂度 O(n* log n)  空间复杂度 O(log n)  不稳定
public class FastSort {
    public static void quikSort(int[] arr, int left, int right) {
        // 1.快排终止条件(递归出口):只有一个元素或者无元素,不进行快排
        if (left >= right) {
            return;
        }
        // 2.选取基准元素:我们以数组左边的元素为基准元素
        int num = arr[left];
        // 定义首尾指针
        int start = left;
        int end = right;
        // 3.指针移动条件:指针未相交
        while (start < end) {
            // 先移动右边的指针(因为选取的是最左边的元素作为基准元素)
                //每次找出第一个比基准元素小的 end停到那
            while (start < end && arr[end] >= num) {
                end--;
            }
            // 再移动左边的指针
            while (start < end && arr[start] <= num) {
                start++;
            }

            // 两指针终止但没相交,交换元素
            if (start < end) {
                int temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;
            }
        }
        // 4.循环结束两指针相交,排序结束,将基准元素放入指针相交位置
        arr[left] = arr[start];
        arr[start] = num;
        // 5.继续递归:分别对基准元素左右两边的元素进行快排 此时基准元素的左边全部小于它本身,右边全部大于它本身
        //快排左边
        quikSort(arr, left, start - 1);
        //快排右边
        quikSort(arr, start + 1, right);
    }
    //主函数
    public static void main(String[] args) {
        int[] arr = {34, 1, 5, -2, 0, 35, 36, 38};
        //初始的left=0;
        //right=arr.length-1;
        quikSort(arr, 0, arr.length - 1);
        for (int value : arr) {
            System.out.print(value+" ");
        }
    }
}

6. 堆排

//5.堆排;
public class Re {
    public static void heapSort(int[] arr) {
        int len = arr.length;
        int[] top = new int[100];
        for (int i = 0; i < top.length; i++) {
            top[i] = arr[i];
        }
        buildHeap(top);
        for (int i = len-1; i >=0 ; i--) {
            swap(arr,0,i);
            len--;
            heapify(arr,0,len);
        }
    }

    public static void buildHeap(int[] arr) {
        int len = arr.length;
        for (int i = len / 2 - 1; i >= 0; i--) {
            heapify(arr, i, len);
        }
    }

    public static void heapify(int[] arr, int i, int len) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int min = i;
        if (left < len && arr[min] > arr[left]) {
            min = left;
        }
        if (right < len && arr[min] > arr[right]) {
            min = right;
        }
        if (min != i) {
            swap(arr, min, i);
            heapify(arr, min, len);
        }
    }

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

7. 归并

//6.归并排序;
import java.util.Arrays;
public class MergeSort {
    //一、拆分部分
    public static void split(int[] arr,int left,int right,int[] temp){
        //递归拆分
        if (left<right){
            int mid=(left+right)/2;
            //左递归分解
            split(arr, left, mid, temp);
            //右递归分解
            split(arr, mid+1, right, temp);
            //合并
            merge(arr,left,right,mid,temp); //这么理解就像递归就是重复干一件事 你调用执行就可
            //上面 先左递归合并 再右递归合并
        }
    }
    //二、合并部分
    /**
     * @param arr   要进行排序的初始数组
     * @param left  左序列数组的初始索引
     * @param right 右序列数组的初始索引
     * @param mid   左序列和右序列的交接地方 中间索引
     */
    public static void merge(int[] arr, int left, int right, int mid, int[] temp) {
        int i = left;//初始化i,作为左序列的初始索引
        int j = mid + 1;//初始化j,作为右序列的初始索引 mid是向下取整得来的
        int index = 0;//temp数组的当前索引
        //1.左右两边序列按照规则填充到temp数组 直到有一边处理完毕
        //循环条件 两边的数据均为处理完
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) { //左元素<=右 就把左里面的首位填充到temp
                temp[index] = arr[i];
                i++;//i后移
                index++;//index后移
            } else {//反之就填充右里面的首位
                temp[index] = arr[j];
                j++;
                index++;
            }
        }
        //当while循环结束 就有其中一边先处理完毕
        //2.把另一边中剩下的的数据直接依次填充到temp数组
            //满足哪个就去哪个循环进行填充
        while (j <= right) {
            temp[index] = arr[j];
            index++;
            j++;
        }
        while ((i <= mid)) {
            temp[index] = arr[i];
            index++;
            i++;
        }
        //3.temp数组拷贝到arr中
        //只有最后一次拷贝是把整个temp拷贝到arr数组中 前几次都是拷贝temp中的一部分
        //因为前几次的合并没有占满temp数组
        index=0;//temp索引归0;
        int tempLeft=left;
//        System.out.println("tempLeft="+tempLeft+" "+"right="+right);
            //第1次合并 tempLeft=0,right=1;
            //第2次合并 tempLeft=2,right=3;
            //第3次合并 tempLeft=0,right=3;
            //第4次合并 tempLeft=4,right=5;
            //第5次合并 tempLeft=6,right=7;
            //第6次合并 tempLeft=4,right=7;
            //第7次合并 tempLeft=0,right=7;//最后一次合并
        while (tempLeft<=right){
            arr[tempLeft]=temp[index];
            tempLeft++;
            index++;
        }

    }

    public static void main(String[] args) {
        int[] arr = new int[]{8, 4, 5, 7, 6, 2, 3, 9};
        int[] temp=new int[arr.length];
        split(arr,0, arr.length-1,temp);
        System.out.println(Arrays.toString(arr));

    }
}

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

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

相关文章

前缀和算法模板

一维前缀和 算法用途&#xff1a;快速求出数组中某一连续区间的和 一维前缀和算法模板 1、预处理出一个 dp 数组 要求原数组存储在 n 1 的空间大小中&#xff0c;其中后 n 个空间存数据。 dp数组&#xff0c;数组开 n 1个空间&#xff0c;dp[i] 表示 [ 1, i ] 区间内所有…

从Spring Cloud Alibaba开始聊架构

作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者胡弦。 另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.htmlhttps://item.jd…

【UnityShader入门精要学习笔记】(3)章节答疑

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 复习&#xff08;阶段性总结…

NLP one-hot编码

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客\n&#x1f366; 参考文章&#xff1a;365天深度学习训练营\n&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.co…

实战干货:用 Python 批量下载百度图片!

为了做一个图像分类的小项目&#xff0c;需要制作自己的数据集。要想制作数据集&#xff0c;就得从网上下载大量的图片&#xff0c;再统一处理。 这时&#xff0c;一张张的保存下载&#xff0c;就显得很繁琐。那么&#xff0c;有没有一种方法可以把搜索到的图片直接下载到本地电…

CSP CCF 201412-2 Z字形扫描 C++满分题解

解题思路&#xff1a; 1.将矩阵分成左上和右下两个部分来看 2.每一个部分都是按着斜线输出 3.同一根斜线上坐标的xy相同&#xff0c;不同线上坐标的xy为公差为1的等差数列 4.左边线上坐标的xy依次变大&#xff0c;右边依次变小 #include<iostream> using namespace s…

1月5日,每日信息差

第一、通用汽车2023年在华销量约210万辆&#xff0c;其中凯迪拉克品牌销量逾18.3万辆&#xff0c;别克品牌销量超51.7万辆&#xff0c;雪佛兰品牌销量约16.9万辆&#xff0c;上汽通用五菱旗下品牌合计销量逾120万辆 第二、无锡全面施行经常居住地登记户口制度。根据无锡户籍新…

VMWare安装Ubuntu

1.下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ 此处记录一些重要的截图&#xff0c;主要是按照史上最全最新Ubuntu20.04安装教程&#xff08;图文&#xff09;进行 安装完成之后&#xff0c;进行清华源配置&#xff0c;参考&#xff1…

VS2017 CMake编译Opencv

先下载opencv4.2.0源码以及opencv_contrib-4.2.0 地址链接&#xff1a;https://pan.baidu.com/s/1AgFsiH4uMqTRJftNXAqmTw?pwd3663 提取码&#xff1a;3663 先建立一个opencv_debug和opencv_release文件夹这两个都是为了后续存放编译好的debug版本和release版本opencv的&#…

IP代理测试:Ping测试如何做?

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况&#xff1f;为了避免这种情况&#xff0c;您可以测试 ping 以查看连接速度。如果您使用代理&#xff0c;此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具&#xff0c;可以帮助…

HarmonyOS 组件通用属性之位置设置

本文 我们来说 通用属性中的位置设置 主要是针对组件的对齐方式 布局方向 显示位置 做过WEB开发的 对流式布局应该都不陌生 就是 一行放内容 不够放就换行 我们可以先这样写 Entry Component struct Index {build() {Row() {Column() {Stack(){Text("你好")Text(&…

科锐16位汇编学习笔记 02 分段,机器码和寻址

分段 问题1 8086是16位cpu&#xff0c;最多可以访问&#xff08;寻址&#xff09;多大内存&#xff1f; - 运算器一次最多处理16位的数据。 - 地址寄存器的最大宽度为16位。 - 访问的最大内存为&#xff1a;216 64K 即 0000 - FF…

毛戈平公司上市终止:产品依赖代工,研发投入低,毛戈平夫妇套现

时隔一年&#xff0c;毛戈平化妆品股份有限公司&#xff08;下称“毛戈平”或“毛戈平公司”&#xff09;在A股的上市之旅再次宣告终止。 据贝多财经了解&#xff0c;毛戈平公司最早于2016年12月预披露招股书&#xff0c;准备在上海证券交易所上市&#xff0c;原计划募资5.12亿…

buildroot 编译错误【001】

在GitHub 查找错误,也挺好用 解决办法 fakeroot 错误 还是用docker构建编译环境安全,镜像解压脚本&#xff0c;写错了位置&#xff0c;生产环境被覆盖&#xff0c;唉 … …

UE4.27_PIE/SIE

UE4.27_PIE/SIE 1. 疑问&#xff1a; 不明白什么是PIE/SIE? 不知道快捷键&#xff1f; 2. PIE/SIE: play in editor/simulate in editor 3. 快捷键&#xff1a; F8: 运行时possess&eject切换 4. 运行操作效果&#xff1a; PIE&SIE

物奇平台蓝牙耳机SOC MIC气密性测试配置方法

物奇平台蓝牙耳机SOC MIC气密性测试配置方法 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 正常的MIC频响曲线 2 异常的MIC频响曲线 FF…

编程语言的未来走向:趋势、挑战与机遇

编程语言的发展趋势 多范式融合与语言泛化 趋势&#xff1a;未来的编程语言可能会更加支持多种编程范式的集成和无缝切换&#xff0c;例如函数式、面向对象、命令式、声明式等。同时&#xff0c;为了适应不同应用场景的需求&#xff0c;通用型编程语言将进一步强化其多功能性&a…

CAVER: Cross-Modal View-Mixed Transformer for Bi-Modal Salient Object Detection

目录 一、论文阅读笔记&#xff1a; 1、摘要&#xff1a; 2、主要贡献点&#xff1a; 3、方法&#xff1a; 3.1 网络的总体框架图&#xff1a; 3.2 Transformer-based Information Propagation Path (TIPP) 3.3 Intra-Modal/Cross-Scale Self-Attention (IMSA/CSSA) Q1…

C语言编译器(C语言编程软件)完全攻略(第十部分:VS2022下载和安装教程(图解版))

介绍常用C语言编译器的安装、配置和使用。 十、VS2022下载和安装教程&#xff08;图解版&#xff09; Visual Studio&#xff08;简称 VS&#xff09;是微软开发的一款 IDE&#xff0c;支持多种编程语言&#xff08;C/C、Python、C#、JavaScript 等&#xff09;&#xff0c;实…

算法每日一题:队列中可以看到的人数 | 单调栈

大家好&#xff0c;我是星恒 今天是一道困难题&#xff0c;他的题解比较好理解&#xff0c;但是不好想出来&#xff0c;接下来就让我带大家来捋一捋这道题的思路&#xff0c;以及他有什么特征 题目&#xff1a;leetcode 1944有 n 个人排成一个队列&#xff0c;从左到右 编号为 …