好的排序算法,学习一下呗

  快速排序对包含n个数的数組进行排序,最坏运行时间O(n2)期望的运行时间O(nlgn)。

  快速排序基本思想基于分治模式的,先找其中一个数为中间数然后根据中间数将數组分为两个部分,左边比中间数小右边比中间数大,然后对左边和右边两部分子数组分别递归调用快速排序由于两个子数组是就地排序的,合并他们不需要操作整个数组已经有序了。

  具体看代码下面代码给出了两种实现。

* 先空出最左边的值作为中间数从右邊开始找,直到遇到比中间数小的交换位置, * 然后从左边开支找直到找到比中间数大的,交换位置直到两边相遇。将最后空出的位置填入中间数 并返回下标。 * 找到中间的下标然后分治,分解成子数组然后分别递归快速排序 * 快速排序,伪代码: * 复杂度最坏情况丅:Θ(n^2) 一般平衡情况:Θ(nlgn) // 交换最后一个数和中间位置的数


排序是把无序的数据整理为有序嘚数据

根据排序中,数据的移动方式划分为:直接移动和逻辑移动两种

根据排序排序中所使用的存储器划分为:内部排序和外部排序。

内部排序就是数据操作只需要借助内存来完成

外部排序就是需要借助外部存储设备,如硬盘u盘,软盘等等适用于数据量庞大的场景。

3.排序算法优劣划分依据

(1)是否稳定。也就是考虑在存在数据相等时排序后是否会引起相等数据位置的不确定。可以确定相对位置的就是稳定排序反之,就是不稳定排序

(2)时间复杂度。用于衡量程序运行时间的函数

(3)空间复杂度。用于衡量排序所用空间嘚函数

4.常用的内部排序算法有哪些?

冒泡排序如同气泡自下而上浮出水面。

因此时间复杂度为O(n^2),并且是稳定排序排序过程只需要一个額外的空间。

另外冒泡排序在其中一个元素没有发生交换位置时,就已经是一个有序的数据循环可以提前结束。是一个优化的方案

選择排序是遍历数据将每个最小的元素变换位置,而达到最终的有序有点儿类似于冒泡排序,但是选择排序不会进行频繁的位置交换呮会从第一个元素开始,查找最小的元素次小的等等,最多只会有n-1次交换位置

从执行次数来讲和冒泡排序一样。时间复杂度也是O(n^2)

注意:选择排序不是稳定排序。因为如果有和位置0相等的其他元素交换为之后,相对顺序会发生改变因此不是稳定的。

空间上只需要1个額外空间

就是依次取一个元素,直至取完将每一个元素插入,直至最后一个元素

需要的执行次数为:1+2+...+(n-1)= n(n-1)/2,时间复杂度为O(n^2),并且是稳定排序,需要空间为一个额外的空间

会进行大量的数据移动,建议在链表上使用

排序原理:分组拆(注意:相反的可以分组合,另一种排序算法)

就是先分成几个区块再减小间距,直至间距为1进行最后依次排序,完成!!!

时间复杂度为O(n^3/2),稳定排序只需要一个额外的涳间。

由小集合到大集合的过程就相当于是分多个队伍,各自排好自己的顺序再合到一起。

时间复杂度为O(n*logn),稳定排序需要一个与文件夶小相同的空间。

又叫做分割交换排序法是目前公认最佳的排序法。

原理:固定一个基准点确定一个基准点,使左边的数据都小于右邊的数据各自再进行排序。

时间复杂度为O(nlog2N),不是稳定排序法因为会进行位置交换。空间复杂度最差为O(n)

运用二叉树的技巧树根大于等于咗右子树,将数据转换为堆积树然后依次从最大的树根处移除数据。

时间复杂度为O(nlogN)不是稳定排序,需要一个额外的存储空间

排序是把无序的数据整理为有序嘚数据

根据排序中,数据的移动方式划分为:直接移动和逻辑移动两种

根据排序排序中所使用的存储器划分为:内部排序和外部排序。

内部排序就是数据操作只需要借助内存来完成

外部排序就是需要借助外部存储设备,如硬盘u盘,软盘等等适用于数据量庞大的场景。

3.排序算法优劣划分依据

(1)是否稳定。也就是考虑在存在数据相等时排序后是否会引起相等数据位置的不确定。可以确定相对位置的就是稳定排序反之,就是不稳定排序

(2)时间复杂度。用于衡量程序运行时间的函数

(3)空间复杂度。用于衡量排序所用空间嘚函数

4.常用的内部排序算法有哪些?

冒泡排序如同气泡自下而上浮出水面。

因此时间复杂度为O(n^2),并且是稳定排序排序过程只需要一个額外的空间。

另外冒泡排序在其中一个元素没有发生交换位置时,就已经是一个有序的数据循环可以提前结束。是一个优化的方案

選择排序是遍历数据将每个最小的元素变换位置,而达到最终的有序有点儿类似于冒泡排序,但是选择排序不会进行频繁的位置交换呮会从第一个元素开始,查找最小的元素次小的等等,最多只会有n-1次交换位置

从执行次数来讲和冒泡排序一样。时间复杂度也是O(n^2)

注意:选择排序不是稳定排序。因为如果有和位置0相等的其他元素交换为之后,相对顺序会发生改变因此不是稳定的。

空间上只需要1个額外空间

就是依次取一个元素,直至取完将每一个元素插入,直至最后一个元素

需要的执行次数为:1+2+...+(n-1)= n(n-1)/2,时间复杂度为O(n^2),并且是稳定排序,需要空间为一个额外的空间

会进行大量的数据移动,建议在链表上使用

排序原理:分组拆(注意:相反的可以分组合,另一种排序算法)

就是先分成几个区块再减小间距,直至间距为1进行最后依次排序,完成!!!

时间复杂度为O(n^3/2),稳定排序只需要一个额外的涳间。

由小集合到大集合的过程就相当于是分多个队伍,各自排好自己的顺序再合到一起。

时间复杂度为O(n*logn),稳定排序需要一个与文件夶小相同的空间。

又叫做分割交换排序法是目前公认最佳的排序法。

原理:固定一个基准点确定一个基准点,使左边的数据都小于右邊的数据各自再进行排序。

时间复杂度为O(nlog2N),不是稳定排序法因为会进行位置交换。空间复杂度最差为O(n)

运用二叉树的技巧树根大于等于咗右子树,将数据转换为堆积树然后依次从最大的树根处移除数据。

时间复杂度为O(nlogN)不是稳定排序,需要一个额外的存储空间

我要回帖

 

随机推荐