[我的第一本算法书] 第二章 排序算法 摘录(冒泡排序,选择排序,插入排序,堆排序,归并排序,快速排序)

冒泡排序:就是重复’从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置’这一操作的算法.这一过程中,数字像泡泡一样,慢慢从右向左’浮’到序列的顶端,所以这个算法才被成为’冒泡排序’

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在冒泡排序中,第一轮要比较n-1次,第二轮要比较n-2次…第n-1轮要比较1次,最终时间复杂度O(n^2),和输入数据的排列顺序无关

选择排序:就是重复’从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换’这一操作的算法.在序列中寻找最小值时时线性查找在这里插入图片描述在这里插入图片描述在这里插入图片描述

选择排序的时间复杂度也和冒泡排序已有,都是O(n^2)

插入排序:是一种从序列左端开始依次对数据进行排序的算法.

在排序过程中,左侧的数据陆续归为,而右侧留下的就是还未被排序的数据.插入排序的思路从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上.
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

插入排序最糟糕的情况下,第2轮需要操作1次,第2轮操作2次,第n轮操作n-1次,所以时间复杂度和冒泡排序一样,都是O(n^2)

堆排序:特点时利用了数据结构中的堆在这里插入图片描述

堆排序将n个数据存进堆里,所需时间为O(nlogn).排序过程中,堆从空堆的状态的时间也是O(nlogn).因此,整体来看堆排序的时间复杂度O(nlogn)在这里插入图片描述

归并排序:会把序列分成长度相同的两个子序列,当无法往下分时(也就是每个子序列中只有一个数据时),就对子序列进行归并.归并指的是把两个排好序的子序列合并成一个有序序列.该操作会一直重复执行,直到所有子序列都归并为一个整体为止.在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

归并排序中:分割序列所花费的时间不算在运行时间中(可与当作序列本来就是分割好的).在合并两个已排好序的子序列时,只需要重复比较首位数据的大小,然后移动较小的数据,因此只需花费和两个子序列的长度相应的运行时间.也就是说,完成一行归并所需的时间取决于这一行的数据量.无论哪一行都是n个数据,每行运行时间O(n),而长度n的序列对半分割到只有一个数据为止,可以分成log2n行,因此总共运行时间为O(nlogn),与堆排序相同

快速排序:首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为’比基准数小的数’和’比基准数大的数’这两个类别,再将其排列成以下形式在这里插入图片描述

接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。对“[ ]”里面的数据进行排序时同样也会使用快速排序。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

快速排序是一种’分治法’.它将原本的问题分成两个子问题(比基准值小的数和比基准值大的数),然后在分别解决这两个问题.子问题,也就是子序列完成排序后,再把它们合成一个序列,那么原始序列的排序就完成了.

不过,解决子问题的时候还会再次使用快速排序,甚至在这个快速排序里仍然要使用快速排序.只有在子问题里只剩一个数字的时候,排序才算完成.
像这样,在算法内部继续使用该算法的现象成为’递归’.实际上,归并排序也可看做时一种递归的分治法.

分割子序列时需要选择基准值,如果每次选择的基准值都能够使得两个子序列的长度为原来的一半,那么快速排序的运行时间和归并排序一样,为O(nlogn).和归并排序类似,将序列对半分割log2n次之后,子序列里便只剩下一个数据,这时子序列的排序就完成了.因此,如果像下图这样一行行展现根据基准值分割序列的过程,那么总共有log2n行在这里插入图片描述

每行中每个数字都需要和基准值比较大小,因此每行执行时间为O(n).由此可知,整体时间复杂度O(nlogn).
如果运气不好,每次都选择最小值为基准值,那么每次都需要把其他数据移动到基准值的右边,递归执行n行,运行时间也就成了O(n^2).这就相当于每次选出最小值并把它移到了最左边,这个操作就和选择排序一样了.此外,如果数据中每个数字被选为基准值的概率都相等,那么平均运行时间为O(nlogn).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值