数据结构排序算法总结

直接插入排序 + 折半插入排序 + 希尔排序

冒泡排序 + 快速排序

选择排序 + 堆排序

归并排序

1.直接插入排序

前面的有序 后面的无序,无序元素插入到前面的有序列表中

        int len = nums.length, i = 1, j = 0;

        for(i=1; i<len; i++){
            int ele = nums[i];
            
            // 插入过程
            for(j = i-1; j >= 0 && nums[j] > ele; j--)
                nums[j+1] = nums[j];
             
             nums[j+1] = ele;
         }
         return nums;

最坏时间复杂度O(n^2),最好时间复杂度O(n),空间复杂度O(1),稳定排序

2.折半插入排序:

折半插入排序可以拆分为 折半查找插入位置 + 数组插入

具体折半查找过程 内部的细节总结 折半查找过程-CSDN博客

        int i, j, ele, m, low, high, len = nums.length;
        for (i = 1; i < len; i++)
        {
            ele = nums[i];
            
            // 折半查找
            low = 0; high = i-1;
            while (low <= high)
            {
                m = (low +high) / 2;
                if(nums[m] > ele)
                    high = m-1;
                else
                    low = m+1;
            }
            
            // 排序
            for (j = i-1; j>=low; j--)
                nums[j+1] = nums[j];
            nums[j+1] = ele;
        }

        return nums;

最坏时间复杂度O(n^2),最好时间复杂度O(n\log n),空间复杂度O(1),稳定排序.

3.冒泡排序:

        // 外层循环控制趟数
        for (int i = 0; i < n - 1; i++) {
            
            flag =false;

            // 内层循环进行比较和交换
            for (int j = 0; j < n - i - 1; j++) {

                if (arr[j] > arr[j + 1]) {

                    swap(arr[j], arr[j+1]);
                    
                    flag = true;
                }
            }
        }

最坏时间复杂度O(n^2),最好时间复杂度O(n),空间复杂度O(1),稳定排序.

4.快速排序:

    public int partition(int[] nums, int left, int right){
       
        int pivot = nums[left];

        while(left < right){

            while(left < right && pivot <= nums[right]) 
                right--;
            nums[left] = nums[right];

            while(left < right && pivot >= nums[left])
                left++;
            nums[right] = nums[left];

        }

        nums[left] = pivot;
        return left;
    }
    public void quickSort(int[] nums, int left, int right){

        if(left < right){
            int partition = partition(nums, left, right);

            quickSort(nums, left, partition-1);
            quickSort(nums, partition+1, right);
        }

    }

最坏时间复杂度O(n^2),最好时间复杂度O(n\log n),空间复杂度O(n\log n),不稳定排序.

每一次确定一个点的最终位置,然后把整个数组划分两部分。形成递归树,最坏情况是树高=n,且每一层都要遍历一次数组。 空间复杂度就是整个递归树。

可参考快速排序最好,最坏,平均复杂度分析_对n个记录进行快速排序,在最坏的情况下,其时间复杂度是-CSDN博客

5.选择排序

    public void selectSort(int[] nums){
        for(int i=0; i<nums.length; i++){
            int index = i;
            int min = nums[i];

            
            for(int j=i; j<nums.length; j++){
                index = nums[j] < min ? j:index;
                min = nums[j] < min ? nums[j] : min;
            }

            nums[index] = nums[i];
            nums[i] = min;
        }
    }

最坏时间复杂度O(n^2),最好时间复杂度O(n^2),空间复杂度O(1),不稳定排序

6.堆排序

分为建堆,调整,排序。

建堆build_heap:  len/2的位置往前遍历 adjust每一个节点。

    public void buildHeap(int[] nums, int len){
        for(int i=(len)/2; i>0; i--){
            adjust(nums, i, len);
        }
    }

调整adjust:  for遍历子节点,顶点往下传。

    public void adjust(int[] nums, int k, int len){
        int val = nums[k];
        for(int i=2*k; i<=len; i=i*2){
            if(i+1 <= len && nums[i+1] > nums[i])
                i = i+1;
            if(nums[i] > val){
                nums[k] = nums[i];
                k = i;
            }
            else
                break;
        }
        nums[k] = val;
    }

整合 堆排序 heap_sort

    public void heapSort(int[] nums, int len){
        buildHeap(nums, len);
        for(int i=len; i>1; i--){
            swap(nums,1,i);
            adjust(nums,1,i-1);
        }
    }

最坏时间复杂度O(n\log n),最好时间复杂度O(n\log n),空间复杂度O(1),不稳定排序.

7.归并排序

把两个有序的子数组 合并为一个 大的有序数组。

merge 合并函数

    public void merge(int[] nums, int left, int mid, int right){
        
        int[] arr = new int[right-left+1];
        for(int i=0; i<arr.length; i++){
            arr[i] = nums[left+i];
        }

        int i = 0;
        int j = mid-left+1;
        int k = left;
        while(i <= mid-left && j <= right-left && k <= right){
            if(arr[i] <= arr[j])
                nums[k++] = arr[i++];
            else
                nums[k++] = arr[j++];
        }

        while(i <= mid-left) 
            nums[k++] = arr[i++];
        while(j <= right-left)
            nums[k++] = arr[j++];
    }

递归 拆分数组

    public void mergeSort(int[] nums, int left, int right){
        
        if(left < right){
            int mid = (left + right) / 2;
            mergeSort(nums, left, mid);
            mergeSort(nums, mid+1, right);
            merge(nums,left, mid, right);
        }
    }

最坏时间复杂度O(n\log n),最好时间复杂度O(n\log n),空间复杂度O(n),稳定排序.

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

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

相关文章

深信服技术认证“SCSA-S”划重点:逻辑漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

springboot设置统一响应头——无效?接口无响应?

背景 对接一个关联方系统&#xff0c;我这边需要提供几个接口。对方要求&#xff0c;这些接口有统一的响应格式&#xff0c;并且有统一的响应头。统一的响应头包含如下&#xff1a; {"TT-Encrypt":"noaction","Content-Encoding":"gzip&q…

v-if 实现不同的状态样式

目录 一、实现思路 二、实现步骤 案例一&#xff1a; ①view部分展示 ②JavaScript 内容 ④ 效果展示 案例二&#xff1a; ①view部分展示 ②JavaScript 内容 ④ 效果展示 ​编辑 一、实现思路 通过v-for循环获取数据并进行判断该条记录中status的状态 给不同的状态赋值&am…

FDTD2018a安装问题记录

FDTD2018a安装问题记录 目录问题解决方案 目录 问题 解决方案 电脑名字如果是中文改成英文

【数据结构】C语言实现顺序栈

顺序栈的C语言实现 导言一、栈的分类二、顺序栈2.1 顺序栈的数据类型2.2 顺序栈的初始化2.3 栈的判空2.5 顺序栈的进栈2.6 顺序栈的出栈2.7 顺序栈的查找2.8 顺序栈的另一种实现方式2.9 顺序栈的销毁 结语 导言 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff0…

【数学建模美赛M奖速成系列】数据可视化(二)

数据可视化&#xff08;二&#xff09; 写在前面百分比堆叠线条图优点缺点实现pythonmatlab 火山图优点实现pythonmatlab 最后 写在前面 上一篇文章为大家分享了山脊图和气泡图的绘图方法与代码&#xff0c;这里学姐为继续为大家分享百分比堆叠线条图和火山图&#xff0c;包含…

Linux下的HTTPS配置:从证书到安全连接

在当今的互联网环境中&#xff0c;数据传输的安全性越来越受到重视。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;通过使用SSL/TLS协议来加密数据传输&#xff0c;确保了数据在传输过程中的安全。在Linux环境下&#xff0c;配置HTTPS需要从证书的生成到服务器的配置进行一…

RT-Thread入门笔记3-线程的创建

线程 RT-Thread 中&#xff0c;线程由三部分组成&#xff1a;线程代码&#xff08;入口函数&#xff09;、线程控制块、线程堆栈. 线程代码: 线程控制块 : 线程控制块是操作系统用于管理线程的一个数据结构&#xff0c; 它会存放线程的一些信息&#xff0c; 例如优先级、 线程…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码&#xff08;直接在cmd命令提示符中&#xff0c;不需要打开Python&#xff09; pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

为何劳保鞋现在如此受欢迎,这就是原因!

当代年轻人最大的消费原则&#xff0c;必须是不花半点冤枉钱&#xff0c;伴随着军大衣成为“时尚单品”&#xff0c;硬核劳保鞋也大受欢迎。今天百华小编就与大家一起看看劳保安全鞋为何如此受大众欢迎呢。 首先&#xff0c;随着人们安全意识的提高&#xff0c;对个人安全和健康…

手把手教你学会接口自动化系列十一-将用例写在json中,持久化管理起来下

上一篇我写了登录&#xff0c;我们发现json还是没有什么大问题&#xff0c;还蛮好用的&#xff0c;但是我们再写下一个&#xff0c;比如线索新建接口的时候&#xff0c;我们写着写着会发现问题&#xff1a; 我们写获取url的没有问题&#xff0c;代码如下&#xff1a; # !/usr…

vue:使用【3.0】:拖拽数据

1、参考链接&#xff1a;vue.draggable中文文档 - itxst.com 2、想要实现的效果图&#xff1a;红框内容可以拖拽 3、安装 yarn add vuedraggablenext npm i -S vuedraggablenext 4、代码 <template><draggable:list"columns"ghost-class"ghost&qu…

mac下配置git自定义快捷命令

1. 指定自定义别名 vi ~/.bash_profile open ~/.bash_profile 配置环境变量,插入类似下面的内容 alias gcgit checkout alias gmgit commit -m alias gcbgit checkout -balias gtgit statusalias gagit add .alias glggit logalias gdgit diffalias grnmgit rm node_modul…

[python]pyside6安装和在pycharm配置

安装命令&#xff1a; pip install PySide6 -i https://mirror.baidu.com/pypi/simple Pycharm配置Pyside6 打开Pycharm点击File -> Settings -> Tools -> External Tools&#xff0c;点击&#xff0b;。需要添加 Pyside6-Designer 、 Pyside6-UIC 和 Pyside6-rcc三…

新手入门Java 方法带参,方法重载及面向对象和面向过程的区别介绍

第二章 方法带参 课前回顾 1.描述类和对象的关系 类是一组对象的共有特征和行为的描述。对象是类的其中一个具体的成员。 2.如何创建对象 类名 对象名 new 类名();3.如何定义和调用方法 public void 方法名(){}对象名.方法名();4.成员变量和局部变量的区别 成员变量有初…

【MySQL高级】——索引的创建设计原则

1. 索引的声明&使用 <1> 索引分类 功能逻辑 说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。物理实现方式 索引可以分为 2 种&#xff1a;聚簇索引和非聚簇索引。作用字段个数 索引可以分为 2 种&#xff1a;单列索引和…

无迹卡尔曼滤波(Unscented Kalman Filter, UKF):理论和应用

无迹卡尔曼滤波&#xff08;Unscented Kalman Filter, UKF&#xff09;&#xff1a;理论和应用 卡尔曼滤波是一种强大的状态估计方法&#xff0c;广泛应用于控制系统、导航、机器人等领域。然而&#xff0c;传统的卡尔曼滤波假设系统是线性的&#xff0c;而在实际应用中&#…

一篇文章带你了解接口测试(总结)

接口测试是软件测试中的一块重要部分&#xff0c;简言之&#xff0c;接口测试是指验证软件系统中各个模块间接口处的交互是否正确。 接口是软件组件之间交互的协议&#xff0c;允许不同的软件系统或模块通过明确定义的方法通信和交换数据。 一. 接口测试的重要性 在微服务架…

USB-C一线通桌面显示器你有见过么?

新型的TYPE-C接口桌面显示器&#xff0c;宛如一位多才多艺的艺术家&#xff0c;它不仅精于视频传输&#xff0c;更在充电领域展现出无与伦比的才华。不同于传统的显示器&#xff0c;它化平凡为神奇&#xff0c;将显示器的DC电源巧妙地转换成PD协议&#xff0c;为各种设备提供稳…

德思特干货丨如何使用SBench6软件对数字化仪采集信号进行处理?(二)——平均运算功能

来源&#xff1a;德思特测量测试 德思特干货丨如何使用SBench6软件对数字化仪采集信号进行处理&#xff1f;&#xff08;二&#xff09;——平均运算功能 原文链接&#xff1a;https://mp.weixin.qq.com/s/j-iN_2Jrn9ZHGMaaAYsDJg 欢迎关注虹科&#xff0c;为您提供最新资讯&…