排序算法剖析

news2024/11/30 10:29:45

文章目录

  • 排序算法浅谈
    • 参考资料
    • 评价指标
    • 可视化工具
    • 概览
  • 插入排序
  • 折半插入排序
  • 希尔排序
  • 冒泡排序
  • 快速排序
  • 简单选择排序
  • 堆排序
  • 归并排序
  • 基数排序

排序算法浅谈

参考资料

数据结构与算法

评价指标

  • 稳定性:两个相同的关键字排序过后相对位置不发生变化
  • 时间复杂度
  • 空间复杂度
  • 适用性:是否适用于链表

可视化工具

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

概览

排序算法稳定性平均时间复杂度平均 空间复杂度备注
插入排序稳定O(n^2)O(1)基本有序时时间复杂度接近O(n)
折半插入排序稳定O(n^2)O(1)查找插入位置是使用折半查找
希尔排序不稳定O(n^1.3)O(1)利用基本有序可以降低插入排序时间复杂度的思想,将数据分组进行插入排序
冒泡排序稳定O(n^2)O(1)基本有序时时间复杂度接近O(n),如果一趟冒泡排序过程中没有发生交换,则说明序列已经有序
快速排序不稳定O(nlogn)O(logn)每次至少确定一个元素位置
选择排序不稳定O(n^2)O(1)每—趟在待排序元素中选取关键字最小的元素加入有序子序列;时间复杂度与初始状态无关
堆排序不稳定O(nlogn)O(1)将序列初始化为堆,然后不断取堆顶元素,并不断调整堆使其保持堆的性质
归并排序稳定O(nlogn)O(n)不断递归合并两个有序序列
基数排序稳定O(d(n+r))拆分成多个位,并按位的权重从小到大进行分配与收集

插入排序

  • 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
  • 稳定性:稳定
  • 时间复杂度:最好O(n),平均O(n^2),最坏O(n^2)
  • 特点: 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)
  • 适用性:适用链表
/**
 * 插入排序
 * 每次将第i个元素,一次与前i个元素比较,正确地插入到[0, i]的序列中
 * 时间复杂度 O(n²)
 *
 * 插入排序有提前终止的可能,效率比选择排序高一点
 * 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)
 * @param arr 待排序数组
 */
 public static void insertionSort(int[] arr) {
     for (int i = 1; i < arr.length; i++) {
         int num = arr[i];
         int j;
         // 前面的元素是否比当前元素大
         for (j = i; j > 0 && num < arr[j-1]; j--) {
             arr[j] = arr[j - 1];
         }
         arr[j] = num;
     }
 }

折半插入排序

  • 算法思想:对于插入排序,要将元素插入到前面的有序序列,由于前面的序列已经有序,那么在查找插入位置时可以使用二分查找算法,也就是折半插入排序
  • 稳定性:稳定
  • 时间复杂度:相比于插入排序只能较少元素比较次数,无法减少元素移动的次数,平均时间复杂度依旧是O(n^2)
  • 特点: 当数组的元素基本有序,那么插入排序的时间复杂度接近O(n)
  • 适用性:不适用链表
    在这里插入图片描述

希尔排序

  • 算法思想:先将待排序表分割成若干形如 L[i, i +d, i + 2d…, i + kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。(n/2, n/4, n/8, …, 1)
  • 稳定性:不稳定
  • 时间复杂度:最坏O(n^2),平均O(n^1.3)
  • 适用性:不适用链表在这里插入图片描述

在这里插入图片描述

冒泡排序

  • 算法思想:从后往前((或从前往后)两两比较相邻元素的值,若为逆序〈(即A[i-1]>A[i]),则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。如果一趟冒泡排序过程中没有发生交换,则说明序列已经有序。
  • 稳定性:稳定
  • 时间复杂度:最好O(n),平均O(n^2)
  • 适用性:适用于链表
  • 特点: 当数组的元素基本有序,那么冒泡排序的时间复杂度接近O(n)

在这里插入图片描述

快速排序

  • 算法思想∶在待排序表L[1…n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和LIk+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
  • 时间复杂度:平均最好O(nlogn),最坏O(n^2)(取决于每个划分是否均衡)
  • 空间复杂度:最好O(logn),最坏O(n)
  • 适用性:不适用于链表
  • 稳定性:不稳定
    在这里插入图片描述
    在这里插入图片描述

简单选择排序

  • 算法思想:每—趟在待排序元素中选取关键字最小的元素加入有序子序列
  • 时间复杂度:O(n^2)无优化空间
  • 适用性:适用于链表
  • 稳定性:不稳定
/**
 * 每进行一次外层循环找出第i小的元素
 * 选择排序,升序
 * 每次都从 [i, n) 中找出最小的元素
 * 时间复杂度 O(n²)
 * @param arr 待排序数组
 */
public static void selectionSort(int[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        swap(arr, i, minIndex);
    }
}

堆排序

  • 大根堆:以完全二叉树顺序存储的方式来看一个数组,每个非终端节点都大于它的左(2i)右(2i+1)节点,非终端节点的编号i <= n/2
  • 算法思想:每一趟将堆顶元素加入有序子序列(与待排序序列中的最后一个元素交换),并将待排序序列再次调整为大根堆
  • 时间复杂度:建堆O(n),整体O(nlogn)
  • 空间复杂度:O(1)
  • 适用性:不适用于链表
  • 稳定性:不稳定
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

归并排序

  • 算法思想:每次将两个有序子序列合并,递归到每个子序列大小为1
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
  • 适用性:适用于链表
  • 稳定性:稳定
public static void mergeSort(int[] arr) {
    mergeSort(arr, 0, arr.length - 1);
}

/**
 * 把当前要排序的数组分成两半,层层递归,直至剩余一个元素
 * 将两半排序好的数组进行合并
*/
private static void mergeSort(int[] arr, int l, int r) {
    if (l >= r) {
        return;
    }
    int mid = l + (r-l)/2;
    mergeSort(arr, l, mid);
    mergeSort(arr, mid + 1, r);
    merge(arr, l, mid, r);
}

private static void merge(int[] arr, int l, int mid, int r) {
    int[] aux = new int[r-l+1];
    for (int i = l; i <= r; i++) {
        aux[i-l] = arr[i];
    }
    int left = l;
    int right = mid + 1;
    for (int i = l; i <=r; i++) {
        if (left > mid) {
            arr[i] = aux[right - l];
            right ++;
        } else if (right > r) {
            arr[i] = aux[left - l];
            left ++;
        } else if (aux[left -l] < aux[right - l]) {
            arr[i] = aux[left - l];
            left ++;
        } else {
            arr[i] = aux[right - l];
            right ++;
        }
    }
}

基数排序

  • 算法思想:分别以个位,十位,百位等(关键字权重递增,百位对关键字的大小影响更大)进行排序和收集
  • 空间复杂度:O®
  • 时间复杂度:O(d(n+r))
  • 稳定性:稳定
  • 应用场景
    • 数据元素的关键字可以方便地拆分为d组,且d较小
    • 每组关键字的取值范围不大,即r较小
    • 数据元素个数n较大
      在这里插入图片描述
      在这里插入图片描述

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

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

相关文章

MyBatisPlus——学习笔记

MyBatisPlus 一、导入依赖 <!-- MyBatisPlus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!-- MySql --><de…

C++基础(7)——STL简介及string类

目录 1.STL简介 1.1什么是 1.2STL的历史版本 1.3STL的六大组件 ​编辑 1.4有用的网址 2.string类 2.1string的多种定义方式 2.2string的插入 2.2.1尾插&#xff08;push_back&#xff09; 2.2.2insert插入 2.3拼接&#xff08;append&#xff09; 2.4删除 2.4.1尾…

CoRL 2024 麻省理工学院提出T3触觉Transformer,打破触觉感知的壁垒,重塑未来机器人

在智能机器人领域&#xff0c;触觉感知的研究正逐渐成为关注的焦点。然而&#xff0c;如何让机器人通过触觉更智能地感知和操作&#xff0c;依然是一个未解决的挑战。基于相机的触觉感知是一种通过在软弹性体下嵌入相机来捕获与环境的细粒度交互的感知方法&#xff0c;是最流行…

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么&#xff1f; 本篇会带大家了解一下java运行时报错输出的信息内容&#xff0c;简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时&#xff0c;你是否会好奇打印出来的那一大坨红色的究竟…

搜索引擎相关的一段实习经历

0 前言 就是跟搜索相关的一段经历。主要工作就是建立倒排索引库相关的一些简单内容。 又翻到了以前的工作&#xff0c;权作纪念。 就是简单的封装cpp的库供python语言调用。 反正就是很多版本问题等等吧各种鬼问题。 我感觉这个思路可能还是待考证。 跨语言的调用我感觉还是不…

泛型编程--模板【C++提升】(特化、类属、参数包的展开、static、模板机制、重载......你想知道的全都有)

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; C系列语法知识_Stark、的博客-CSDN博客 其它专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 C系列项目实战_Stark、的博客-CSDN博客 座右铭&#xff1a;梦…

Java中的while和do...while循环

while和do...while循环 while循环基本语法执行流程注意事项练习 do...while循环基本语法说明流程图练习 while循环 基本语法 循环变量初始化; while(循环条件){循环体&#xff08;语句&#xff09;;循环变量迭代; }1&#xff09;while循环也有四要素&#xff1a;循环变量初始…

【JNI】普通类型的基本使用

简单使用 在上一期我们介绍了JNI的基本使用&#xff0c;这里简单介绍一下普通类型 HelloJNI.java&#xff1a;这里计算两个整型数的平均值&#xff0c;返回值类型为double public class HelloJNI { static {System.loadLibrary("hello"); }private native String …

electron-builder 首次执行报错问题解决

假日想研究一下 react electron 的使用&#xff0c;结果发现首次打包疯狂报错&#xff0c;研究了一下之后才发现是第一次的话 electron-builder 会从外面下载依赖包到我们系统中&#xff0c;由于某种力量导致压缩包无法下载或者是下载过慢导致失败&#xff0c;要解决其实也简单…

认知战认知作战:2024年9月30日中国股市大涨背景下的认知战分析报告

认知战认知作战&#xff1a;2024年9月30日中国股市大涨背景下的认知战分析报告 关键词&#xff1a;认知战, 中国股市, 信息操纵, 心理战, 技术战, 信息监管, 投资者素养, 国际合作, 法律法规, 协同作战, 谣言澄清, 市场情绪,认知作战,新质生产力,人类命运共同体,认知战,认知域…

《Linux从小白到高手》理论篇:深入理解Linux的计划任务/定时任务

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的计划任务/定时计划。 Linux的计划任务 在很多时候为了自动化管理系统&#xff0c;我们都会用到计划任务&#xff0c;比如关机&#xff0c;重启&#xff0c;备份之类…

二叉树--堆

1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两…

CSP-J Day 4 模拟赛补题报告

姓名&#xff1a;王胤皓&#xff0c;校区&#xff1a;和谐校区&#xff0c;考试时间&#xff1a; 2024 2024 2024 年 10 10 10 月 4 4 4 日 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00&#xff0c;学号&#xff1a; S 07738 S07738 S07738 请关注作者的…

Windows应用开发-解析AVI视频文件

本Windows应用解析AVI视频文件&#xff0c;以表格的方式显示AVI文件结构。并可以将结果保存到bmp图片。下面是&#xff0c;使用该应用解析一部AVI电影获得的图片。 应用开发信息 定义一个INFO结构&#xff0c;包含两个字符串对象&#xff0c;一个ULONGLONG变量&#xff0c;和…

奔驰AMG GT50升级原厂阀门运动排气声浪效果

AMG 排气系统 声浪级别可控制的AMG高性能排气系统可带来不同凡响的听觉体验。借助可调式废气风门&#xff0c;按下按钮&#xff0c;即可按需改变车辆的声浪&#xff0c;体验不同音色。静谧深沉或动感澎湃&#xff0c;悦耳声浪&#xff0c;如你所愿。

Python画笔案例-076 绘制纯画笔弹球

1、绘制纯画笔弹球 通过 python 的turtle 库绘制 纯画笔弹球,如下图: 2、实现代码 绘制纯画笔弹球,以下为实现代码: """纯画笔弹球动画.py读者可以在此基础上把它修改成一个拦球游戏。步骤为,建立一个Rect类,即矩形类。然后采用按键检测,当按了键时重画…

​​Python+Matplotlib可视化简单反函数和复合函数

import numpy as np import matplotlib.pyplot as plt# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 用黑体显示中文 plt.rcParams[axes.unicode_minus] False # 正常显示负号# 创建图形和子图 fig, (ax1, ax2) plt.subplots(1, 2, figsize(15, 6))# 反函数示…

Line: 折线图

对北京市、天津市、上海市、重庆市的近10年人口&#xff0c;做出折线图&#xff0c;效果 参考&#xff1a;Line - Basic_line_chart - Document (pyecharts.org) 1、折线图模板 import pyecharts.options as opts from pyecharts.charts import Linex_data ["Mon"…

基于Springboot+Vue的中医院问诊系统的设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

内存卡数据恢复软件大揭秘,拯救你的重要数据

我们的生活中充斥着各种各样的数据&#xff0c;而内存卡作为一种常见的数据存储设备&#xff0c;承载着我们的照片、视频、文档等重要信息。然而存储在电子设备上就有可能导致数据丢失的情况。今天我们一起来探讨内存卡数据恢复的一些工具吧。 1.福晰内存卡数据恢复 连接直达…