排序

最经典最常用的排序有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。

我们在分析排序算法的时间复杂度时,要分别给出最好情况、最坏情况、平均情况下的时间复杂度。除此之外,你还要说出最好。最坏书剑复杂度对应的要排序的原始数据是什么样的。

为什么要区分三种时间复杂度呢?第一,有些排序算法会区分,为了好对比,所以最好做一下区分;第二,对于要排序的数据,有的接近有序,有的完全无序。有序度不同的数据,对于排序的执行时间肯定是有影响的,我们要知道排序算法在不同的数据下性能表现。

原地排序:原地排序算法就是特指空间复杂度是O(1)的排序算法。

冒泡排序包含两个操作原子,比较和交换。每交换一次,有序度为1。不管算法怎么改进交换次数总是确定的,即为逆序度,也就是n*(n-1)/2初始有序度。

***插入排序:***(Insertion Sort)
一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序?很简单,我们只要遍历数组,找到数据应该插入的位置将其插入即可。

对于不同的查找插入点方法(从头到尾,从尾到头),元素的比较次数是有区别的,但对于一个给定的初始序列,移动操作的次数总是固定的,就等于逆序度。

***选择排序:***(Selection Sort)
选择排序算法的思路有丢点类似插入排序,也分已排序去见和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

***归并排序:***(Merge Sort)
思想:先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将拍后序的两部分合并在一起,这样整个数组就都有序了。

归并排序使用的是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧

快速排序:
思想:如果要排序数组中下标从p到r之间的一组数组,我们选择p到r之间的任意一个数据作为pivot(分区点)。我们遍历p到r之间的数据,将小于pivot放到左边,将大于pivot的放到右边,将pivot放到中间,经过这一步骤之后,数组p到r之间的数据就被分成了三个部分,前面p到q-1之间都是小于pivot的,中间是pivot,后面是q+1到r之间是大于pivot的。

快速排序和归并排序的区别:
用的都是分治思想,递推公式和递归代码也非常相似。归并排序的处理过程是由下到上的,先处理子问题,然后在合并。而快排正好相反,它的处理过程是由上到下的,先分区,然后在处理子问题。归并排序虽然是稳定的,时间复杂度为O(nlogn)的排序算法,但是它非原地排序算法。我们前面讲过,归并之所以是非原地排序算法,主要原因是合并了函数无法在原地执行。快速排序通过设计巧妙地原地分区函数,可以实现原地排序,解决了归并排序占用太多内存问题。

冒泡排序、插入排序、选择排序的时间复杂度是O(n^2),适合小规模的数据排序;
归并排序、快速排序的 时间复杂度是O(nlogn),适合大规模的数据排序,用到分治思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值