Go 1.19 排序算法

news/2025/2/4 3:45:08/

插入排序(InsertionSort)

插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素插入到已经排好序的序列中,从而得到一个新的有序序列。插入排序的具体过程如下:

  1. 从第一个元素开始,认为它已经是有序的序列。
  2. 取出下一个元素,在已经排序的序列中从后向前扫描。
  3. 如果已经排序的序列中的元素大于新元素,将该元素移到下一个位置。
  4. 重复步骤3,直到已经排序的序列中的元素小于等于新元素。
  5. 将新元素插入到该位置后。
  6. 重复步骤2~5,直到所有元素都排序完成。

时间复杂度为O(n^2),空间复杂度为O(1),对于小规模的数据集来说,插入排序的效率是比较高的。

快速排序(QuickSort)

快速排序是一种基于分治思想的排序算法,它的基本思想是将待排序的序列分成两个子序列,其中一个子序列的所有元素都比另一个子序列的元素小,然后对这两个子序列分别进行排序,最终将它们合并成一个有序序列。快速排序的具体过程如下:

  1. 选择一个基准元素,通常是待排序序列的第一个元素。
  2. 将待排序序列分成两个子序列,其中一个子序列的所有元素都比基准元素小,另一个子序列的所有元素都比基准元素大。
  3. 对两个子序列分别进行快速排序,直到子序列中只剩下一个元素或为空。
  4. 将两个子序列合并成一个有序序列,其中基准元素放在两个子序列的中间位置。

时间复杂度为O(nlogn),最坏时间复杂度为O(n^2)

快速排序的效率比较高,因为它采用了分治的思想,可以将大规模的数据集分成小规模的数据集进行处理。

为了避免快速排序的最坏时间复杂度,可以采用随机化快速排序或者三路快排等算法来进行优化。

堆排序(HeapSort)

堆排序是一种基于堆的数据结构的排序算法,它的基本思想是将待排序的序列构建成一个堆,然后依次将堆顶元素取出来放入已排序序列中,最终得到一个有序序列。堆排序的具体过程如下:

  1. 将待排序的序列构建成一个堆,通常采用的是大根堆或小根堆。
  2. 将堆顶元素取出来,放入已排序序列中。
  3. 将堆的最后一个元素移动到堆顶,然后重新调整堆,使其满足堆的性质。
  4. 重复步骤2~3,直到堆中的元素全部取出来。

时间复杂度为O(nlogn),空间复杂度为O(n)

堆排序的效率比较高,因为它采用了堆的数据结构,可以快速的找到堆中的最大或最小元素。

堆排序是一种不稳定的排序算法,因为在构建堆的过程中可能会改变相同元素的相对位置。

对比

随机的情况下对比:

image.png

序列本身有序的情况下对比:

image.png

结论

  • 插入排序在短序列和序列有序的情况下最快
  • 大部分情况下,快速排序由较好的综合性能
  • 堆排序在任何情况下表现都比较好

pdqsort —— pattern-defeating-quicksort

pdqsort是一种快速、原地、稳定的排序算法,它是由Orson Peters于2019年提出的。pdqsort的原理是基于经典的快速排序算法,但它采用了一些新的技术来提高性能和稳定性。

pdqsort的主要思想是将快速排序分为两个阶段:

  1. 快速排序
  2. 插入排序
  • 在快速排序阶段,pdqsort使用经典的快速排序算法,选择一个中间元素作为枢轴(pivot),将数据分为两个子序列,并递归地对这两个子序列进行排序。但是,pdqsort在选择枢轴时采用了一些新的技术,如三点中值法(median-of-three),以避免最坏情况的发生。

  • 在插入排序阶段,pdqsort使用插入排序算法对小的子序列进行排序。插入排序是一种简单而有效的排序算法,它对小的子序列的排序效果很好。pdqsort通过在快速排序阶段和插入排序阶段之间进行平滑的转换,来保持排序的稳定性。

pdqsort还采用了一些其他的技术来提高性能和稳定性,如分区排序(partition sort)和双轴快速排序(dual-pivot quicksort)。这些技术使得pdqsort在处理大量数据时具有很好的性能,并且可以保持排序的稳定性。


http://www.ppmy.cn/news/126050.html

相关文章

ubuntu安装(Wireless 8265 / 8275网卡)---failed, not work!!!!

Failed, not work!!!!, please do not try!!! linux官网无线驱动: https://wireless.wiki.kernel.org/ (Wireless 8265 / 8275网卡) 支持的内核版本是 4.6, Ubuntu14.04内核是4.4 ,按照前面的帖子升级到 4.6.4。 先安…

华为HuaWei MateBook X 8代(i5-8265u) 笔记本安装Win7系统

网上一小伙伴,找我重装系统,说新入手不久的华为笔记本电脑 MateBook X 2019 版,我了解了下配置,Intel i5-8265U处理器,8G内存,512G 三星 NVME固态. 这配置啊,我一看,不适合Win10&am…

Wireless-AC 8265 CentOS7 无线网卡驱动安装

Wireless-AC 8265 & CentOS7 无线网卡驱动安装 环境说明: 系统 CentOS7内核: 3.xxx硬件: Wireless-AC 8265 # 查看网卡信息 lsusb# 确认网卡的版本 lspci | grep Network# 扫描周围无线wifi iwlist scanning下载驱动 Inger官方无线驱动下载 安装驱动 # 下载解压 [ro…

基于龙芯2K1000适配WIFI模块(型号:Intel 8265NGW)

硬件平台:龙芯2K1000 evb开发板 + Intel 8265NGW 开发环境:Ubuntu16.04+gcc-4.9.3-64-gnu 平台环境1:PMON+linux3.10+loongnix1.0 平台环境2:uboot+linux4.19.161+buildroot GCC来源:GCC 工具:龙芯的EJTAG调试工具。 接口原理图如下: 模块图片:     1、平台环境PMON+…

无线网卡Intel Corporation Wireless 8265 / 8275在ubuntu系统不能工作

问题背景 T470p笔记本安装ubuntu 18.04 后,无线网卡Intel Corporation Wireless 8265 / 8275 驱动缺失的问题。 分析问题 参考方法一:https://ubuntuforums.org/showthread.php?t2370912 参考方法二:https://forums.linuxmint.com/viewto…

【C++中map和unordered_map存储自定义类型需要做什么】

目录 一、map存储自定义类型 二、unordered_map存储自定义类型 一、map存储自定义类型 需要传入的参数是key-value键值对&#xff0c;和仿函数类型 对于内置类型&#xff0c;int、double、char重载了operator<所以传入less仿函数不会出错 但是对于自定义类型&#xff0c;如…

云原生:从基本概念到实践,解析演进与现状

文章目录 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状概念演进之路DockerKubernetesCloud NativeServerless 业界现状总结 结语 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状 本文仅用于简单普及&#xff0c;达到的目的是给没接触过或者很…

4600php,4600万像素DC 适马DP1 Merrill报6980元

SIGMA DP1 Merrill采用了23.515.7mm全彩色的Foveon X3全色影像感侧器“Merrill”,拥有4600万像素(4,8003,2003层)和44个记录百万像素(4,7043,1363层)&#xff0c;本周合作经销商对这台机器的报价为6980元(含税)。 SIGMA DP1 Merrill SIGMA DP1 Merrill具备高性能的广角19mm F2.…