算法基础 | 常用排序算法小结(三)

简介: 算法基础 | 常用排序算法小结

5

归并排序(Merge Sort)



小伙子,你造归并吗?

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。效率为O(nlogn),1945年由冯·诺伊曼首次提出。归并排序的实现分为递归实现与非递归(迭代)实现。这里我们讨论递归实现。归并排序依赖于归并操作。归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。


基本原理:

1)申请内存空间A,大小为两个已排序列之和。


2)设定两个指针,分别指向两个已排序列的首元素。


3)比较两个指针指向的元素大小,将小的那个元素丢进内存空间A。同时指向该元素的指针向前移动一位。


4)不断重复步骤3),直到任何一个序列的元素全被丢进空间A。那么就把另外一个序列剩下的所有元素丢进空间A。


Understand?别说了,看图吧。

微信图片_20220420152233.jpg

兄弟,来,干了这段代码。

微信图片_20220420152236.jpg

归并排序是稳定的算法。


6

快速排序(Quick Sort)




1

终于说到这个大boss了。为什么叫快速排序呢?额,这个倒不是因为它很快。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:开始选取一个基准数,通过一趟排序将基准数移到序列的合适位置,使得,左边的这部分都小于等于基准数,右边的部分都大于等于基准数,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


那么,对于一个序列,怎样才能使基准数移动到正确位置,以便能使左边的数都小于等于它,右边的数都大于等于它呢?还是以数组A[N]为例,为大家慢慢道来:


1)设置两个变量i、j,排序开始的时候:i=0,j=N;


2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];


3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;


4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;


5)重复第3、4步,直到i=j;


6)3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束。


还是来看看图吧:

微信图片_20220420152241.jpg

聪明的同学已经发现了,当序列中的每个元素都归位的时候,整个序列也就都变得有序了。

微信图片_20220420152243.jpg

看完了图解是不是感觉贼得劲儿了呢??

微信图片_20220420152247.jpg

看代码:

微信图片_20220420152250.jpg

快速排序是不稳定的排序算法。


OK自此,常用的排序算法已经介绍完毕,今天的表演到此结束,谢谢大家。


最后再多说两句

这次内容量有点大啊

小伙伴们要耐下心来多看几遍

不懂就再多看几遍

最后谢谢大家的支持,共勉共进。

祝大家早日练就大佬的姿态

微信图片_20220420152253.jpg

相关文章
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
16天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
63 8
|
16天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
55 7
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
27 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
53 9
|
1月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
21 0
数据结构与算法学习十四:常用排序算法总结和对比
|
1月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
24 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
32 0
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
72 0
下一篇
无影云桌面