【数据结构-排序】8.2 冒泡排序-快速排序

一、冒泡排序

1.1 原理

  • 基于"交换"的排序:根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置
  • 冒泡排序:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即Ai-1>A[i)),则交换它们,直到序列比较完。称这样过程为"一趟"冒泡排序

1.2 排序过程

  • 初始状态
  • 第一趟

  • 第二趟


    ...
    ...
    ...
  • 第五趟

1.3 算法实现

1.4 性能分析

1.5 冒泡用于链表

1.6 总结

二、快速排序

2.1. 算法原理

  • 算法思想:在待排序表L1...n中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L1...k-1和Lk+1...n,使得L1...k-1中的所有元素小于pivot,Lk+1...n中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次"划分"。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

2.2. 排序过程

  • 第一趟 :选定最左边的第一个元素49作为枢轴pivot,比49小的元素放到左边,比49大的元素放到右边

high指针向左移动,找到27比49小,则将27移动到枢轴pivot左边

low指针向右移动,找到65比49大,则将65移动到枢轴pivot右边

...
...
...

  • 第一趟结束:用第一个元素把待排序序列"划分"为两个部分。左边更小,右边更大。该元素的最终位置已确定
  • 第二趟排序
    (1)以49为中心,对左右两边的序列重新进行递归快速排序;
    (2)左边选取27作为枢轴pivot,进行快速排序;
    (3)右边选取76作为枢轴pivot,进行快速排序。


    ...
    ...
    ...
  • 最终排序结果:

2.3. 算法效率分析

  • 每一层的QuickSort只需要处理剩余的待排序元素,时间复杂度不超过O(n)
  • 时间复杂度=O(n*递归层数)
  • 空间复杂度=O(递归层数)
  • 把n个元素组织成二叉树,二叉树的层数就是递归调用的层数
  • 最坏的情况:每一次选中的"枢轴 "将待排序序列划分为很不均匀 的两个部分,则会导致递归深度增加,算法效率变低
  • 比较好的情况:每一次选中的"枢轴 "将待排序序列划分为均匀的两个部分 ,则递归深度最小,算法效率最高

2.4. 总结

相关推荐
dtq042419 分钟前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
洛水水1 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
Coder-magician2 小时前
《代码随想录》刷题打卡day15:二叉树part05
数据结构·c++·算法
Darling噜啦啦2 小时前
二叉树与递归算法实战:从树结构到 LeetCode 爬楼梯,一文吃透前端数据结构与递归思维
前端·javascript·数据结构
Irissgwe2 小时前
算法的时间复杂度和空间复杂度
数据结构·c++·算法·c·时间复杂度·空间复杂度
qq_297574673 小时前
设计模式系列文章(基础篇第22篇):访问者模式——分离数据结构与操作,实现灵活扩展
数据结构·设计模式·访问者模式
云淡风轻~窗明几净3 小时前
角谷猜想的任意算法测试
数据结构·人工智能·算法
代码中介商3 小时前
关键路径解析:项目管理的工期奥秘
数据结构
love_muming4 小时前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
玖玥拾4 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++