常见排序算法及复杂度分析

news2025/5/18 1:20:16

冒泡排序 (Bubble Sort)

基本思想

  • 相邻元素比较,大的元素后移
  • 每轮将最大元素"冒泡"到末尾

代码实现

void bubbleSort(int arr[], int n) {

    for (int i = 0; i < n-1; i++) {

        for (int j = 0; j < n-i-1; j++) {

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

                swap(arr[j], arr[j+1]);

            }

        }

    }

}

复杂度分析

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 最好情况:O(n)
  • 最坏情况:O(n²)

2. 选择排序 (Selection Sort)

基本思想

  • 每次从未排序区域选择最小元素
  • 放到已排序区域末尾

代码实现

void selectionSort(int arr[], int n) {

    for (int i = 0; i < n-1; i++) {

        int min_idx = i;

        for (int j = i+1; j < n; j++) {

            if (arr[j] < arr[min_idx]) {

                min_idx = j;

            }

        }

        swap(arr[i], arr[min_idx]);

    }

}

复杂度分析

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 最好情况:O(n²)
  • 最坏情况:O(n²)

3. 插入排序 (Insertion Sort)

基本思想

  • 将元素插入到已排序区域的合适位置
  • 适合小数据量或基本有序数据

代码实现

void insertionSort(int arr[], int n) {

    for (int i = 1; i < n; i++) {

        int key = arr[i];

        int j = i-1;

        while (j >= 0 && arr[j] > key) {

            arr[j+1] = arr[j];

            j--;

        }

        arr[j+1] = key;

    }

}

复杂度分析

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定
  • 最好情况:O(n)
  • 最坏情况:O(n²)

4. 快速排序 (Quick Sort)

基本思想

  • 选择基准元素
  • 将小于基准的元素放在左边
  • 将大于基准的元素放在右边
  • 递归处理左右两部分

代码实现

void quickSort(int arr[], int low, int high) {

    if (low < high) {

        int pi = partition(arr, low, high);

        quickSort(arr, low, pi-1);

        quickSort(arr, pi+1, high);

    }

}

复杂度分析

  • 时间复杂度:平均O(nlogn)
  • 空间复杂度:O(logn)
  • 稳定性:不稳定
  • 最好情况:O(nlogn)
  • 最坏情况:O(n²)

5. 归并排序 (Merge Sort)

基本思想

  • 将数组分成两半
  • 递归排序两半
  • 合并两个有序数组

代码实现

void mergeSort(int arr[], int l, int r) {

    if (l < r) {

        int m = l + (r-l)/2;

        mergeSort(arr, l, m);

        mergeSort(arr, m+1, r);

        merge(arr, l, m, r);

    }

}

复杂度分析

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
  • 稳定性:稳定
  • 最好情况:O(nlogn)
  • 最坏情况:O(nlogn)

6. 堆排序 (Heap Sort)

基本思想

  • 构建最大堆
  • 将堆顶元素与末尾元素交换
  • 重新调整堆

代码实现

void heapSort(int arr[], int n) {

    for (int i = n/2-1; i >= 0; i--)

        heapify(arr, n, i);

    

    for (int i = n-1; i > 0; i--) {

        swap(arr[0], arr[i]);

        heapify(arr, i, 0);

    }

}

复杂度分析

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 最好情况:O(nlogn)
  • 最坏情况:O(nlogn)

7. 希尔排序 (Shell Sort)

基本思想

  • 是插入排序的改进版
  • 通过不同的间隔序列进行分组插入排序

代码实现

void shellSort(int arr[], int n) {

    for (int gap = n/2; gap > 0; gap /= 2) {

        for (int i = gap; i < n; i++) {

            int temp = arr[i];

            int j;

            for (j = i; j >= gap && arr[j-gap] > temp; j -= gap)

                arr[j] = arr[j-gap];

            arr[j] = temp;

        }

    }

}

复杂度分析

  • 时间复杂度:取决于间隔序列,平均O(n^1.3)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
  • 最好情况:O(n)
  • 最坏情况:O(n²)

8. 计数排序 (Counting Sort)

基本思想

  • 统计每个元素出现的次数
  • 根据统计结果重建数组

代码实现

void countingSort(int arr[], int n) {

    int max = arr[0];

    for (int i = 1; i < n; i++)

        if (arr[i] > max)

            max = arr[i];

            

    int count[max+1] = {0};

    for (int i = 0; i < n; i++)

        count[arr[i]]++;

        

    int index = 0;

    for (int i = 0; i <= max; i++)

        while (count[i]--)

            arr[index++] = i;

}

复杂度分析

  • 时间复杂度:O(n+k),k为数据范围
  • 空间复杂度:O(k)
  • 稳定性:稳定
  • 最好情况:O(n+k)
  • 最坏情况:O(n+k)

9. 基数排序 (Radix Sort)

基本思想

  • 按照位数进行排序
  • 从最低位到最高位依次排序

代码实现

void radixSort(int arr[], int n) {

    int max = arr[0];

    for (int i = 1; i < n; i++)

        if (arr[i] > max)

            max = arr[i];

            

    for (int exp = 1; max/exp > 0; exp *= 10)

        countSort(arr, n, exp);

}

复杂度分析

  • 时间复杂度:O(d(n+k)),d为位数
  • 空间复杂度:O(n+k)
  • 稳定性:稳定
  • 最好情况:O(d(n+k))
  • 最坏情况:O(d(n+k))

10. 排序算法比较表

| 排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |

|:--------:|:--------------:|:--------:|:--------:|:----------:|:------:|

| 冒泡排序 | O(n²) | O(n) | O(n²) | O(1) | 稳定 |

| 选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |

| 插入排序 | O(n²) | O(n) | O(n²) | O(1) | 稳定 |

| 快速排序 | O(nlogn) | O(nlogn) | O(n²) | O(logn) | 不稳定 |

| 归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |

| 堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |

| 希尔排序 | O(n^1.3) | O(n) | O(n²) | O(1) | 不稳定 |

| 计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |

| 基数排序 | O(d(n+k)) | O(d(n+k)) | O(d(n+k)) | O(n+k) | 稳定 |

11. 选择建议

  1. 小数据量(n < 50):
  • 插入排序
  • 冒泡排序
  • 选择排序
  1. 中等数据量(50 < n < 1000):
  • 快速排序
  • 归并排序
  • 堆排序
  1. 大数据量(n > 1000):
  • 快速排序
  • 归并排序
  • 堆排序
  1. 特殊场景:
  • 需要稳定性:归并排序
  • 数据范围小:计数排序
  • 字符串排序:基数排序
  • 内存受限:堆排序

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

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

相关文章

彻底解决sublime text4无法打开install package界面安装插件问题

1. 说明 最新版的 sublime text4&#xff0c;不管是通过软件自带的命令安装的 package control 插件&#xff0c;还是从官网下载的 package control 插件&#xff0c;之后通过 CommandShiftP 打开面板&#xff0c;输入 Package Control&#xff0c;可能找不到 Package Control…

用户现场不支持路由映射,如何快速将安防监控EasyCVR视频汇聚平台映射到公网?

一、方案背景​ 随着数字化安防与智能交通管理发展&#xff0c;视频监控远程管理需求激增。EasyCVR作为专业视频融合平台&#xff0c;具备多协议接入等核心功能&#xff0c;是智能监控的重要工具。但实际部署中&#xff0c;当EasyCVR处于内网且路由器无法进行端口映射时&#…

C#实现访问远程硬盘(附源码)

在现实场景中&#xff0c;我们经常用到远程桌面功能&#xff0c;而在某些场景下&#xff0c;我们需要使用类似的远程硬盘功能&#xff0c;这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么&#xff0c;这样的远程硬盘功能要怎么实现了&#xff1f; 这次我们将给出…

图片、音频、视频都能转?简鹿格式工厂了解一下

我们每天都会接触到各种各样的音视频和图片文件。无论是拍摄的照片、录制的视频&#xff0c;还是下载的音频资源&#xff0c;它们往往以不同的格式存在——有些适合分享&#xff0c;有些适合编辑&#xff0c;而有些则仅限特定设备或平台使用。格式不统一的问题&#xff0c;正在…

Qt—用SQLite实现简单的注册登录界面

1.实现目标 本次实现通过SQLite制作一个简易的登录窗口&#xff0c;当点击注册按钮时&#xff0c;登录窗口会消失&#xff0c;会出现一个新的注册界面&#xff1b;完成注册或退出注册时&#xff0c;注册窗口会消失&#xff0c;重新出现登录窗口。注册过的用户信息会出现在SQLi…

MySQL命令行导出数据(docker版本)

MySQL命令行导出数据(docker版本) 1、登录数据库 $mysql -h 10.1.1.143 -u root -p 2、用命令行从MySQL导出数据(无标题) #查看导出时可以存储的路径 mysql> SHOW VARIABLES LIKE secure_file_priv; ----------------------------------------- | Variable_name | Valu…

Python 3.13.3 安装教程

原文来自&#xff1a;Python 3.13.3 安装教程 | w3cschool笔记 &#xff08;请勿标记为付费&#xff01;&#xff01;&#xff01;&#xff09; Python 是一种广泛使用的编程语言&#xff0c;广泛应用于 Web 开发、科学计算、数据处理、人工智能等领域。Python 3.13.3 作为 P…

现代化水库运行管理矩阵平台如何建设?

政策背景 2023年8月24日&#xff0c;水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出&#xff0c;在全面推进水库工程标准化管理的基础上&#xff0c;强化数字赋能&#xff0c;加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理&#xff0c;完…

2025程序设计天梯赛补题报告

2025程序设计天梯赛补题报告 仅包含L1 L2 L1-6 这不是字符串题 题目描述 因为每年天梯赛字符串题的解答率都不尽如人意&#xff0c;因此出题组从几年前开始决定&#xff1a;每年的天梯赛的 15 分一定会有一道字符串题&#xff0c;另外一道则一定不是字符串题。 小特现在有…

SpringBoot3.4.5下Lombok的@Data注解不生效,解决方案

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 1.问题 最近的项目是Python、Java、鸿蒙的来回交叉&#xff0c;再做的一个Java的项目…

如何在 Windows 上安装类似 Synaptic 的 Chocolatey GUI 包管理器

如果你正在寻找类似 Linux 中 APT 的 Windows 包管理器&#xff0c;那么没有什么比 Chocolatey 更好的了。它是 Windows 10 上可用的最佳包管理器之一&#xff0c;可以通过命令行界面安装所有流行的软件和工具。然而&#xff0c;这并不意味着如果你不喜欢命令行&#xff0c;你就…

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候&#xff0c;刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…

智能AI构建工地安全网:跌倒、抽搐、区域入侵多场景覆盖

智能AI在工地安全中的应用&#xff1a;从监测到救援的全流程实践 一、背景&#xff1a;高温作业下的工地安全挑战 随着夏季高温持续&#xff0c;工地户外作业环境面临严峻考验。工人因高温疲劳、脱水或突发疾病引发的行为异常&#xff08;如晕厥、抽搐、跌倒&#xff09;频发…

Spring+LangChain4j小智医疗项目

这里写目录标题 LangChain4j入门配置测试Ollama阿里云百炼平台AIService聊天记忆隔离聊天 MongoDB持久化存储Prompt*创建小智医疗助手Function Calling&#xff08;Tools&#xff09;实战小智医疗智能体 RAGToken分词器向量存储流式输出总结 LangChain4j入门 LangChain4j 是一…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…

buuctf Crypto-鸡藕椒盐味1

1.题目&#xff1a; 公司食堂最新出了一种小吃&#xff0c;叫鸡藕椒盐味汉堡&#xff0c;售价八块钱&#xff0c;为了促销&#xff0c;上面有一个验证码&#xff0c;输入后可以再换取一个汉堡。但是问题是每个验证码几乎都有错误,而且打印的时候倒了一下。小明买到了一个汉堡&a…

FreeRTOS的学习记录(基础知识)

FreeRTOS 简介 FreeRTOS 是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;专为嵌入式系统设计。它提供了任务管理、时间管理、信号量、消息队列、内存管理等功能&#xff0c;适用于资源受限的微控制器。 FreeRTOS 是一个开源的实时操作系统内核&#xff0c…

会议分享|高超声速流动测量技术研讨会精彩探析

由中国空气动力学会测控专业委员会主办&#xff0c;中国科学技术大学工程科学学院承办的第八届三次委员会暨高超声速流动测量技术研讨会&#xff0c;5月16日在合肥盛大开幕。 会议专家报告分享了高超声速流动测量的最新研究成果、挑战与突破&#xff0c;展示了PIV高速摄像机、粒…

1-10 目录树

在ZIP归档文件中&#xff0c;保留着所有压缩文件和目录的相对路径和名称。当使用WinZIP等GUI软件打开ZIP归档文件时&#xff0c;可以从这些信息中重建目录的树状结构。请编写程序实现目录的树状结构的重建工作。 输入格式: 输入首先给出正整数N&#xff08;≤104&#xff09;…

Unix/Linux | A Programming Guide

注&#xff1a;本文为 “UNIX / Linux 教程” 相关文章合辑。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 UNIX / Linux Tutorial for Beginners: Learn Online in 7 days By : Emily Carter UpdatedFebruary 5, 2025 UNIX / Linux Tutorial Summary Linux …