对冒泡、快排、堆排这3个算法做了验证,结果分析如下:

一、结果分析

时间消耗:快排 < 堆排 < 冒泡。

空间消耗:冒泡O(1) = 堆排O(1) < 快排O(logn)~O(n) 。

应用推荐:

  1、速度最快、且允许占用少量的空间:选快排。

  2、速度快且空间最小(O(1)):选堆排。

  3、要求相同大小的元素顺序不能变更:选冒泡。

  4、完全不考虑空间消耗的:用基排(极限情况下时间O(n),限制较多,不单独说了)。

冒泡排序:

  优点:稳定、空间复杂度O(1)

  缺点:慢

  时间复杂度最好为n(传入的数组有序,一轮循环即可截止),最坏为n^2,平均为n^2。呈现为n增大10倍,耗时增加100倍。

  在对稳定性有要求的场景下,即相同大小的元素先后顺序不能变更,冒泡排序表现较佳。快排和堆排都是不稳定的。冒泡每次比较相邻的元素,只有不等时才考虑是否交换,所以冒泡不会改变相同大小的元素的顺序,是稳定的排序算法。

快速排序:

  优点:快

  缺点:不稳定、空间复杂度O(logn)~O(n)

  时间复杂度最好为nlogn,最坏为n^2(每次key都在首或尾,栈深度达到n),平均为nlogn。

  为了减小最坏情况发生的概率,我们在选择Key的时候,取了首、尾和中间这3个元素里的中间大小的元素作为Key

  相比其他两种算法,快排需要依靠函数栈(递归)或其他类型的存储空间(非递归)来存储每次划分的区间。最好的情况下,每次都平均划分,需要额外的logn的空间;最坏情况下每次都划分在首或尾,则额外的空间花销达到n。

堆排序:

  优点:快(比较快排慢点)、空间复杂度O(1)

  缺点:不稳定

  时间复杂度稳定在nlogn。

  快排和堆排的时间复杂度都是nlogn,为什么快排会更快呢?因为堆排的复杂度的常系数更大。我们从另一个角度来看。堆排每次将堆顶元素取出,取而代之的是堆底元素。而这个新的堆顶元素显然是比较小的,肯定要比其中一个子节点小。于是调整堆时,拿刚换上来的较小的根与下面的子节点比较,结果有很大可能是要交换多次(甚至于被换回堆底)。这种比较是概率不均等的、很不划算的。而堆排中充斥着大量这种不均等的比较,造成很多多余的交换,这就是为什么堆排会更慢。

二、源码

冒泡:https://www.cnblogs.com/JoZSM/p/9768735.html

快排:https://www.cnblogs.com/JoZSM/p/9768781.html

堆排:https://www.cnblogs.com/JoZSM/p/9783872.html

验证代码:涉及到造数据、存文件等,代码较长,不贴出来了。有需要的可以留言。

排序算法C语言实现——冒泡、快排、堆排对比的更多相关文章

  1. 排序算法C语言实现——插入排序(优于冒泡)

    为什么插入排序要优于冒泡? 插入排序在于向已排序序列中插入新元素,主要的动作是移动元素,涉及1次赋值,即data[j] = data[j-1]; 而冒泡排序在于相邻元素交换位置,涉及3条赋值,即iTm ...

  2. 快色排序算法(C语言描述)

    快速排序 算法思想 快速排序采用了一种分治策略,学术上称之为分治法(Divide-and-Conquer Method). 哨兵(如下算法中的key) 每趟排序将哨兵插入到数组的合适位置,使得哨兵左侧 ...

  3. 【转】九大排序算法-C语言实现及详解

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  4. 排序算法c语言描述---冒泡排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  5. 排序算法C语言实现

    大学有一门课程叫做数据结构,严蔚敏的课本,其中详细介绍了集中经典的排序算法,学习复习反复几次,但是直到现在仍然只记得名字了,所以想记录下来,随时复习直至牢记于心.经常面试的朋友知道,排序算法在面试中出 ...

  6. 排序算法c语言描述---堆排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序.具体思路分析不 ...

  7. 各种排序算法(C语言)

    #include <stdlib.h> #include <stdio.h> void DataSwap(int* data1, int* data2) { int temp ...

  8. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  9. 排序算法(Apex 语言)

    /* Code function : 冒泡排序算法 冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值 时间复杂度:O(n*n) 空间复杂度:1 */ List< ...

随机推荐

  1. 关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)

    不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到…… 然后我在后端从service到controller都debug了一遍,发现数据都没 ...

  2. 103 Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行).例如:给定二叉树 [3,9,20,null,null,15,7],    3   ...

  3. Access denied for user ''@'localhost' to database 的一个问题

    $conn = new mysqli("127.0.0.1", 'abc', '', DB_DATABASE); 在提供了用户名的情况下,竟然返回错误 说用户提供的用户为空,非常奇 ...

  4. 顾问Advisor Aspectj注解

    顾问Advisor  通知 advice PointcutAdvisor  一个接口  是顾问的一种. . 任意单个字符 + 重复1到多次 * 重复0到多次 NameMetchMethodPointc ...

  5. autofac 遇到构造函数问题

    None of the constructors found with 'aaaaa' on type ' aaa' can be invoked with the available service ...

  6. HDU4035 Maze(期望DP)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...

  7. Android adb命令,linux中各种命令

    常用的ADB命令 1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器 ...

  8. [windows]设置使用空白密码进行远程登录

    前提:系统用户设置了空白密码 方法1步骤: 开始菜单--〉运行--〉输入:gpedit.msc--> 计算机配置--〉Windows设置--〉安全设置--〉本地策略--〉安全选项:帐户:使用空白 ...

  9. hihoCoder hiho一下 第四十六周 博弈游戏·Nim游戏·三( sg函数 )

    题意: 给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路: 先规矩地计算出sg值,再对每个数量查SG值就可以了.最后求异或和.和不为0的就是必赢. ...

  10. OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1)

    适用于: Oracle Database - Enterprise Edition - 版本 10.2.0.1 到 11.2.0.1.0 [发行版 10.2 到 11.2]本文档所含信息适用于所有平台 ...