排序算法总结

【C++】排序算法 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序、快速排序、计数排序、基数排序、桶排序、外排序 阅读详情

交换排序

冒泡排序

[cpp]  view plain  copy
  1. // 冒泡排序 =======================================  
  2. void bubbleSort(int num[], int n) {//【冒泡排序】  
  3.     for(int i=0; i < n-1; i++) {// 需要 n-1 次排序  
  4.         for(int j=0; j < n-1-i; j++) {  
  5.             if(num[j] > num[j+1]) {  
  6.                 int temp = num[j];  
  7.                 num[j] = num[j+1];  
  8.                 num[j+1] = temp;  
  9.             }  
  10.         }  
  11.     }  
  12. }  

快速排序

[cpp]  view plain  copy
  1. // 快速排序 =======================================  
  2. //void quickSort(int num[], int left, int right) {//【快速排序】  
  3. //    if(left < right) {  
  4. //        int temp = num[left];  
  5. //        int low = left;  
  6. //        int high = right;  
  7. //        while(low < high) {  
  8. //            while(low < high && num[high] >= temp) {  
  9. //                high--;  
  10. //            }  
  11. //            num[low] = num[high];  
  12. //            while(low < high && num[low] < temp) {  
  13. //                low++;  
  14. //            }  
  15. //            num[high] = num[low];  
  16. //        }  
  17. //        num[low] = temp;  
  18. //  
  19. //        quickSort(num, left, low-1);  
  20. //        quickSort(num, low+1, right);  
  21. //    }  
  22. //}  
  23. int Partition(int num[], int left, int right) {  
  24.     int index = left + (right-left>>1);//注意:移位操作的优先级比加减法运算低  
  25.     int temp = num[index];  
  26.     num[index] = num[left];  
  27.     while(left < right) {  
  28.         while(left < right && temp <= num[right])  
  29.             right--;  
  30.         num[left] = num[right];  
  31.         while(left < right && temp > num[left])  
  32.             left++;  
  33.         num[right] = num[left];  
  34.     }  
  35.     num[left] = temp;  
  36.     return left;  
  37. }  
  38. void quickSort(int num[], int left, int right) {//【快速排序】  
  39.     if(left < right) {  
  40.         int index = Partition(num, left, right);  
  41.         quickSort(num, left, index-1);  
  42.         quickSort(num, index+1, right);  
  43.     }  
  44. }  

插入排序

直接插入排序

[cpp]  view plain  copy
  1. // 插入排序 =======================================  
  2. void insertSort(int num[],int n) {//【直接插入排序】  
  3.     for(int i=1; i < n; i++) {  
  4.         if(num[i] < num[i-1]) {  
  5.             int temp = num[i];  
  6.             int j = i-1;  
  7.             while(j >=0 && temp < num[j]) {  
  8.                 num[j+1] = num[j];  
  9.                 j--;  
  10.             }  
  11.             num[j+1] = temp;  
  12.         }  
  13.     }  
  14. }  

希尔排序

[cpp]  view plain  copy
  1. // 希尔排序 =======================================  
  2. void shellSort(int num[], int n) {//【希尔排序】  
  3.     for(int gap = n/2; gap > 0; gap/=2) {  
  4.         for(int i = gap; i < n; i++) {  
  5.             if(num[i] < num[i-gap]) {  
  6.                 int temp = num[i];  
  7.                 int j = i - gap;  
  8.                 while(j >= 0 && temp < num[j]) {  
  9.                     num[j+gap] = num[j];  
  10.                     j -= gap;  
  11.                 }  
  12.                 num[j+gap] = temp;  
  13.             }  
  14.         }  
  15.     }  
  16. }  

选择排序

直接选择排序

[cpp]  view plain  copy
  1. // 选择排序 =======================================  
  2. void selectSort(int num[], int n) {//【直接选择排序】  
  3.     for(int i=0; i < n-1; i++) {// 需要 n-1 次排序,每次从剩余的数中找出最小的那个数,然后和剩余数中的第一个数交换  
  4.         int index = i;// 先假设剩余数中第一个数为最小值。index 用于记录剩余数中的那个最小值的索引  
  5.         for(int j=i+1; j < n; j++) {  
  6.             if(num[j] < num[index]) {  
  7.                 index = j;  
  8.             }  
  9.         }  
  10.   
  11.         if(index != i) {// 将剩余数中找到的那个最小值,和剩余数中的第一个数交换  
  12.             int temp = num[i];  
  13.             num[i] = num[index];  
  14.             num[index] = temp;  
  15.         }  
  16.     }  
  17. }  

堆排序

[cpp]  view plain  copy
  1. // 堆排序 =========================================  
  2. void heapAdjust(int num[], int n, int i) {// 调整节点 i  
  3.     if(i <= n/2-1 && n != 0) {// 保证是非叶子节点  
  4.         int leftChild = 2 * i + 1;// 节点 i 的左孩子  
  5.         int rightChild = 2 * i + 2;// 节点 i 的右孩子  
  6.         int index = i;  
  7.         if(num[index] < num[leftChild]) {  
  8.             index = leftChild;  
  9.         }  
  10.         if(rightChild < n && num[index] < num[rightChild]) {  
  11.             index = rightChild;  
  12.         }  
  13.         if(index != i) {  
  14.             int temp = num[i];  
  15.             num[i] = num[index];  
  16.             num[index] = temp;  
  17.   
  18.             heapAdjust(num, n, index);  
  19.         }  
  20.     }  
  21. }  
  22.   
  23. void heapSort(int num[], int n) {//【堆排序】  
  24.     // 构造初始堆。从最后一个非叶子节点开始调整  
  25.     for(int i=n/2-1; i >= 0; i--) {  
  26.         heapAdjust(num, n, i);  
  27.     }  
  28.   
  29.     // 有了初始堆,开始排序  
  30.     for(int i=n-1; i >= 1; i--) {  
  31.         // 交换堆顶元素和最后一个元素  
  32.         int temp = num[0];  
  33.         num[0] = num[i];  
  34.         num[i] = temp;  
  35.   
  36.         // 重新调整堆顶节点成为大顶堆  
  37.         heapAdjust(num, i, 0);  
  38.     }  
  39. }  

归并排序

[cpp]  view plain  copy
  1. // 归并排序 =======================================  
  2. void mergeArray(int L[], int R[], int first, int middle, int last) {  
  3.     int i,k;  
  4.     i = k = first;  
  5.     int j = middle + 1;  
  6.     while(i<=middle && j<=last) {  
  7.         if(L[i] <= L[j])  
  8.             R[k++] = L[i++];  
  9.         else  
  10.             R[k++] = L[j++];  
  11.     }  
  12.     while(i <= middle)  
  13.         R[k++] = L[i++];  
  14.     while(j <= last)  
  15.         R[k++] = L[j++];  
  16.     for(i=first; i <=last; i++)  
  17.         L[i] = R[i];  
  18. }  
  19.   
  20. void MSort(int num[], int temp[], int first, int last) {  
  21.     if(first == last)  
  22.         temp[first] = num[first];  
  23.     else {  
  24.         int middle = (first + last) / 2;  
  25.         MSort(num, temp, first, middle);  
  26.         MSort(num, temp, middle+1, last);  
  27.         mergeArray(temp, num, first, middle, last);  
  28.     }  
  29. }  
  30.   
  31. void mergeSort(int num[], int n) {//【归并排序】  
  32.     int* temp = new int[n];  
  33.     MSort(num, temp, 0, n-1);  
  34. }  


各种常用排序算法

类别

排序方法

时间复杂度

空间复杂度

稳定性

平均情况

最好情况

最坏情况

辅助存储

交换排序

冒泡排序

O(n2)

O(n)

O(n2)

O(1)

稳定

快速排序

O(nlog2n)

O(nlog2n)

O(n2)

O(logn)

不稳定

插入排序

直接插入

O(n2)

O(n)

O(n2)

O(1)

稳定

希尔排序

O(n1.3)

O(nlog2n)

O(n2)

O(1)

不稳定

选择排序

直接选择

O(n2)

O(n2)

O(n2)

O(1)

不稳定

堆排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(1)

不稳定

归并排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(n)

稳定

基数排序(桶排序)

O(d(r+n))

O(d(rd+n))

O(d(r+n))

O(rd+n)

稳定

注意:基数排序的复杂度中:r代表关键字的基数,d代表长度,n代表关键字的个数

排序算法:稳定的排序算法 元素,并围绕主元对列表进行分区,将较小的元素放入低数组中,将所有较大的元素放入高数组中。然后,我们对他们的第十位的值进行排序。因此,我们可以对任意大小的列表进行排序,而无需在冒泡排序中使用任何额外的空间。我们可以说,子问题可以被视为对数组的一部分进行排序,从任何索引 s(start) 开始,到任何索引 e(end) 结束。正如我们上面所讨论的,最大堆是一个完全二叉树,其中每个内部节点中的值都大于或等于该节点的子节点中的值。此外,每次迭代后,已排序子数组的大小都会增加,而未排序子数组的大小会减少。 阅读详情

相关推荐

八种排序算法

偶尔有看到排序算法,想起来大学里老师也有讲授过冒泡排序、快速排序等,不过现在已经没什么概念,一查发现排序算法有八种,有的甚至连名字都没听过,感概平时看的少。既然已经看到了,就干脆了解下基础概念,避免在后续学习途中,出现一看就懵逼的情况。   冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到...

dobat的博客 3348

堆排序的两种方法实现(Python)以及面试中关于堆排序的相关题目

一、堆排序的两种做法 对堆排序完全没有了解的同学,可以先看一下B站上的这个视频 https://www.bilibili.com/video/BV1Eb41147dK/ 同时,堆排序的第一种做法也是基于这个视频的。 1、堆排序的第一种做法 def heapify(arr,n,i): large = i #父节点的下标为i left_child = 2*i+1 #左孩子下标 right_child = 2*i+2 if left_child<n and arr

Matrix_cc的博客 932

排序算法总结及C++实现

文章目录1 引入 认识时间复杂度2 补充 对数器3 排序算法分析3.1 基于比较的排序3.1.1 冒泡排序3.1.2 选择排序3.1.3 插入排序3.1.4 归并排序补充题目 小和问题补充题目 逆序数3.1.5 快速排序3.1.6 堆排序3.2 非基于比较的排序3.2.1 计数排序3.2.2 桶排序3.2.3 基数排序4 排序总结4.1 稳定性4.2 工程中的综合排序算法4.3 有关排序...

李滚滚的博客 2222

快速排序

要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。  注:1,cutoff值为5,不足cutoff使用插入排序。         2,输入、输出格式参见测试用例0。 测试输入 41 17 34 0 19 # 测试输入 After Sorting: 0 17 19 34 41 Median3 Value: n

野狼 1859

排序算法 - 面试中的排序算法总结

排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。 一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对

从零开始 2982

使用海康机器人的SDK进行DWS开发时如何筛选不同类型的相机

使用MVIDCodeReader、MvCodeReaderSDK、MvVolMeasureSDK联合开发时,通常会做一些设备枚举列表,但是不同类型的设备需要枚举在不同的列表中,便于软件使用者配置参数,例如: 如何保证枚举出来的设备是可以选择的对应的设备。我们通常枚举出来的是这样的: 解决办法 在联合开发中,我们发现,只有MvVolMeasureSDK的枚举设备接口EnumStereoCamEx可以正确的只枚举出网络内的体积设备,其余的MVIDCodeReader、MvCodeReaderS

qq_29123967的博客 2732

九大排序算法再总结

如果要转载,需要注明出处: http://blog.youkuaiyun.com/xiazdong 本文是 http://blog.youkuaiyun.com/xiazdong/article/details/7304239 的补充,当年看了《大话数据结构》总结的,但是现在看了《算法导论》,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍。 本文首先介绍了基于比较模型的排序算法,

xiazdong 31万+

PX4开发环境搭建(Ubuntu1804+QGC+Qt Creator )

文章目录前言一、安装环境二、PX4环境搭建1. 在虚拟机中安装Ubuntu2. 安装PX4环境(1)下载PX4源码:(2) 安装工具链(3) jMAVSim仿真(4) 编译验证三、安装QGC四、安装Qt Creator 前言 在这之前作者完全没接触过PX4,安装过程遇到了很多坑,而且每安装下载一个东西都要等好久,出现问题又要重新开始,前后折腾了四天才弄好,希望此文对大家有所帮助。 一、安装环境 ...

Beyonderwei的博客 9021

「排序算法」十大经典排序算法

文章目录十大经典排序算法一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 引用网站:菜鸟教程十大经典排序 十大经典排序算法 排序算法图片总结(图片来源于网络) 一、冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢

秋天,黄叶坠地,凉风有信。 6427

VMware 17+Win10 22H2全栈配置指南|UEFI优化+GPU直通实战

​VMware下载:下载官网版本的Wmare 17 Pro (点击直达链接 )企业用户可选永久许可证,个人学习也可以直接安装使用,Win10镜像:微软官网下载22H2版ISO文件(附官方纯净版渠道 )

waicsdn_haha的博客 4019

常见js手撕题及算法总结

设计一个lazyMan,实现以下功能: LazyMan(‘Tony’); // Hi I am Tony LazyMan(‘Tony’).sleep(10).eat(‘lunch’); // Hi I am Tony // 等待了10秒… // I am eating lunch LazyMan(‘Tony’).eat(‘lunch’).sleep(10).eat(‘dinner’); // H...

没有名字适合我的博客 3176

稳定排序算法有哪些

稳定排序算法有哪些 相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 “稳定” 的,有些是 “不稳定” 的。 给定的待排序序列中,经常会包含相同的元素,例如: 3 1 2 4 2 此序列中包含两个元素 2,为了区分它们,我们分别称它们为 “红 2” 和 “绿 2”。 评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序列中红 2 和绿 2 的相对位置是:红 2 位于绿 2 的左侧,或者说绿 2 位于红 2

ccc369639963的博客 1万+

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记

介绍: The 7 series FPGAs Transceivers Wizard LogiCORE™ IP 自动创建配置7系列fpga 收发器的HDL封装。向导可以配置一个或多个支持行业主流标准的高速串行收发器。或者从零开始支持各种自定义协议。 功能: 创建配置7系列fpga 收发器的HDL封装。 自动对模拟设置进行配置。 预定义了提供Aurora 8B/10B, Aurora 64B/66B, CEI-6G,DisplayPort, Interlaken, Open Base StationAr..

w0shishabi的博客 5万+

【排序算法】排序算法总结

排序算法总结,将排序算法的分类、稳定性和特点进行一个总结,并附有跳转到对应详解的链接,方便大家学习

weixin_52811588的博客 983

记录一次小项目中的重放攻击与解决方案

文章目录1、重放攻击简介2、重放攻击演示3、解决方案4、重放攻击验证 欢迎各位 前(提)来(出)讨(意)论(见)。 1、重放攻击简介 重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。 举个简单的小例子。 我们往系统里面插入一条数据,如果此次操作的数据包被攻击者获取,又恰巧后台没有对重复内容进行验证,那么攻击者就可以利用该数据包重复的发起请求,无限制的往数据库插入数据,即使请求包是加密的也

fiveSix 8725

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证

SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 602

什么是排序算法?常见的排序算法有哪些?

计数排序适用于数据范围较小且已知的情况,其时间复杂度为线性时间,非常适合处理小范围内的数据排序。基数排序适用于整数排序,特别是当数据范围较大但数据量适中时。它通过多次应用计数排序来实现多轮排序,从而克服了传统排序算法在处理大范围数据时的效率问题。

破损的天堂鸟博客 1226

几款开源的自动驾驶仿真平台项目

它被开发为一个虚幻的插件,可以简单地放到任何你想要的虚幻环境中。第一类是基于合成的数据,对环境、感知及车辆进行模拟,这里的感知大多数是图像层面的感知,这类模拟器主要用于感知、规划算法的初步开发上,Carla、AirSim、Udacity self-driving car simulator就属于这类;第二类是基于真实数据的回放,这里的真实数据包括图像、lidar、radar等各种传感器的数据,这类模拟器主要用于测试无人驾驶中信息融合算法以及车辆不同部件的性能,Apollo和Autoware就属于这类。

南七小僧的学海无涯 2849

十大经典排序算法

十种常见的排序算法可分为以下两大类: 比较类排序:通过比较来决定元素间的相对位置,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对位置,它可以突破基于比较排序的时间下限,以线性时间运行,因此也称为线性时间非比较类排序。 时间复杂度: 从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。

qq_40896594的博客 3672

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

排序算法详解

排序算法是计算机科学中最基础也最重要的算法之一。它将一组数据(例如数字列表、字符串集合)按照特定的顺序(升序或降序)重新排列。高效的排序算法对于优化其他算法(如搜索和合并算法)的效率至关重要。

m0_54069809的博客 1168

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

十大排序算法

算法稳定性:单次比较后,两个值相等的邻近元素的位置在排序后,相对位置没有改变。

一名想做出点成就的后端~ 1428

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

常见排序算法详解

排序是我们在日常生活和工作中常见的一种操作。在计算机科学中,排序算法就是将一串或一组数据按照特定的顺序进行排列的算法。这些顺序可能是数字的升序或降序,也可能是字母或字词的字母顺序等。我们将探讨几种不同的排序算法,包括他们的原理、优缺点以及代码实现。常见的排序算法包括:冒泡排序、快速排序、插入排序、选择排序、希尔排序、归并排序、堆排序、基数排序等。这些排序算法中,有些是比较排序,即通过比较元素之间的关系进行排序;

沐雨风栉 874
上一篇: STL 容器一些底层机制
下一篇: 哈希表算法解析以及面试题目应用
Solid7
博客等级 码龄11年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值