【排序算法总结】

news2024/12/29 10:15:50

目录

  • 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));

    }
}

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

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

相关文章

Yolov5/8的小程序部署前后端实现

Yolov5/8的小程序部署前后端实现 导语本机配置硬件环境配置 前端实现后端实现总结参考文献 导语 毕设的题目与Yolo系列的图像识别相关&#xff0c;通过搜查了很多资料和实践最后完成&#xff0c;看到某些平台上居然卖300&#xff0c;觉得很离谱&#xff0c;所以决定把代码开源…

年底了,准备跳槽的可以看看...

前两天跟朋友感慨&#xff0c;今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经1月了&#xff0c;具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出…

【电路笔记】-电感器

电感器 文章目录 电感器1、概述2、电感器的时间常数3、电感器示例1 电感器是一种由线圈组成的无源电气元件&#xff0c;其设计目的是利用电流通过线圈而产生的磁力和电力之间的关系。 1、概述 在本中&#xff0c;我们将看到电感器是一种电子元件&#xff0c;用于将电感引入到电…

JavaScript新加入的**运算符,哪里有些不一样呢?

JavaScript语法(四)&#xff1a;新加入的**运算符&#xff0c;哪里有些不一样呢&#xff1f; 上一节课我们已经给你介绍了表达式的一些结构&#xff0c;其中关于赋值表达式&#xff0c;我们讲完了它的左边部分&#xff0c;而留下了它右边部分&#xff0c;那么&#xff0c;我们…

mysql: 2006, ‘MySQL server has gone away‘

一、错误问题 这个问题是在迁移数据库、备份还原或数据导入时报错&#xff1a;2006, ‘MySQL server has gone away‘ 二、出现原因 sql操作的时间过长&#xff0c;或者是传送的数据太大(例如使用insert ... values的语句过长&#xff0c; 这种情况可以通过修改max_allowed_pac…

DZ-200系列中间继电器 板后不带底座 DZY-212X DC220V JOSEF约瑟

DZY-200系列中间继电器 系列型号&#xff1a; DZY-201中间继电器 DZY-222中间继电器 DZY-202中间继电器 DZY-203中间继电器 DZY-204中间继电器 DZY-205中间继电器 DZY-206中间继电器 DZY-207中间继电器 DZY-208中间继电器 DZY-209中间继电器 DZY-210中间继电器 DZY-211中间继电…

Linkage Mapper 工具参数详解——Centrality Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&…

AI绘画治愈系风景

大家好&#xff0c;分享风景壁纸&#xff0c;缓解心情。 是非成败转头空&#xff0c;青山常在&#xff0c;暖阳不移。 渡人先渡己&#xff0c;选取色彩缤纷故事&#xff0c;运用AI绘画&#xff0c;构建我们平时极少看到的场景&#xff0c;又有冲突和破碎感&#xff0c;融在一…

Spring Boot 整合 Knife4j(快速上手)

关于 Knife4j 官方文档&#xff1a;https://doc.xiaominfo.com/ Knife4j是一个基于Swagger的API文档生成工具&#xff0c;它提供了一种方便的方式来为Spring Boot项目生成在线API文档。Knife4j的特点包括&#xff1a; 自动化生成&#xff1a;通过Swagger注解&#xff0c;Kn…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

算法基础之合并果子

合并果子 核心思想&#xff1a; 贪心 Huffman树(算法): 每次将两个最小的堆合并 然后不断向上合并 #include<iostream>#include<algorithm>#include<queue> //用小根堆实现找最小堆using namespace std;int main(){int n;cin>>n;priority_queue&l…

从零学Java - 面向对象 abstract

面向对象 abstract 文章目录 面向对象 abstract1.什么是抽象?1.1 生活中的抽象 2.抽象类2.1 不该被创建对象的类2.2 抽象类的语法2.3 抽象类的作用2.4 抽象类的特点 3.抽象方法3.1 不该被实现的方法3.2 抽象方法的语法3.3 抽象方法的特点 4.总结4.1 抽象类4.2 抽象方法 1.什么…

SpringCloud之Eureka组件工作原理详解

Eureka是一种服务注册与发现组件&#xff0c;最初由Netflix开发并开源出来。它主要用于构建分布式系统中的微服务架构&#xff0c;并提供了服务注册、服务发现、负载均衡等功能。在本文中&#xff0c;我们将详细解释Eureka的工作原理。 一、Eureka概述 Eureka是Netflix开源的一…

QT上位机开发(网络程序界面开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机对接方式还是以232、485、can为主&#xff0c;随着网络的发展&#xff0c;越来越多的设备都是以网络进行通信的。毕竟相比较之前&…

x-cmd pkg | procs - ps 命令的现代化替代品

目录 简介首次用户功能特点类似工具进一步阅读 简介 procs 是用 Rust 编写的 ps 替代品&#xff0c;用于显示有关任务进程的信息 首次用户 使用 x procs 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x 命令安装, 详情参考 x-cmd…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

nginx 二、配置域名

文章目录 一、配置本地域名查看虚拟机ip修改hosts文件测试域名是否配置成功 二、配置aliyun域名三、实践1.创建html2.配置nginx3.测试服务器内部测试页面测试 总结 docker中启动nginx容器完成如下操作&#xff0c;对于docker安装nginx可以看这篇文章 nginx 一、安装与conf浅析 …

【产品应用】一体化伺服电机在管道检测机器人中的应用

一体化伺服电机在管道检测机器人的应用正日益受到关注。管道检测机器人是一种能够在管道内部进行检测和维护的智能化设备&#xff0c;它可以检测管道的内部结构、泄漏、腐蚀等问题&#xff0c;以确保管道的安全和稳定运行。而一体化伺服电机作为机器人的动力源&#xff0c;对于…

在mybatis中编写SQL时,提示表名和字段名的设置方法

一、在设置中搜索SQL Dialects 二、将Global SQL Dialect和Project SQL Dialect设置为MySQL 三、添加Path&#xff0c;选择当前项目&#xff0c;完成后应用 四、连接要使用的数据库&#xff0c;连接到具体要使用的数据库 五、连接完成后&#xff0c;在xml中编写sql语句就会有…

数据结构:图详解

图的存储方式 邻接矩阵 首先先创建图&#xff0c;这一个我们可以使用邻接矩阵或者邻接链 表来进行存储&#xff0c;我们要实现的无向图的创建&#xff0c;我们先创建 一个矩阵尺寸为n*n&#xff0c;n为图中的节点个数如图所示 可以看出图中有5个结点&#xff0c;那我们创建…