排序 算法

来源:互联网 发布:网络设计收获与体会 编辑:程序博客网 时间:2024/06/05 05:26

简介

冒泡排序(快速排序)、简单选择排序(堆排序)、直接插入排序(希尔算法)、归并排序,这几种排序都属于内排序

冒泡排序

1、思想
最简单冒泡排序:相邻的两个关键字两两相互比较,反序就交换位置,直到没有反序,看起来就像水中的气泡,从数组的最后一个关键字开始比较,较小的气泡慢慢地冒出水面(数组下标靠前),较大的数字留在下面
正宗冒泡排序:从最后两个关键字开始比较,将更小的数字向上作比较,直到找到更小的数,然后才移动位置,直到更小的数冒在上面,更大的数冒在下面,
2、算法实现思路
最简单冒泡排序:需要用到内外两次循环,外部第一次循环的时候找到最小的数字放入最小下标中,外部第二次循环放入数组第二个位置
3、复杂度分析
因为都需要用到内外两次循环,所以时间复杂度是O(n2)

快速排序:

1、思想
首先将 一个无序序列分割成两部分,其中一部分的关键字均比另一部分小,然后再对这两部分继续进行上述处理,最终得到有序的序列。
2、算法实现思路
该算法实现的关键在于选取正确的枢轴(将一部分序列一分为二的中间关键字)
3、复杂度分析
在时间复杂度分析中,最优的 情况为每次的枢轴选得恰到好处,使得无序序列最终按照类似于二叉排序数的方式分布成一个有序数组,因此时间复杂度为O(nlogn),最差情况下,以一种类似斜树来排,此时的比较次数为Σ(n-i)=1+2+3…+n-1+n-2,时间复杂度为O(n2),平均情况下时间复杂度仍然为nlogn.
空间复杂度分析:斜树的空间复杂度为O(n),最优情况下的空间复杂度为O(log2n),平均情况空间复杂度为O(logn)
不稳定的排序算法

简单选择排序

1、思想:不断进行位置交换而不是数组移动,最终完成排序。
2、算法实现思路
第一轮比较从所有的关键字中找出最小的那个,放在第一个位置(直接位置交换),第二轮比较找出后面数组中最小的那个,放在第二个位置。。。。。
3、复杂度分析
不管怎么样比较次数都是一样多的,移动次数为1+2+3……+n-2+n-1为O(n2),情况复杂时只会导致移动次数不同,但交换次数最多n-1,移动次数与比较次数相加整合在一起仍然是O(n2)

堆排序

1、思想
大(小)顶堆:首先是完全二叉树,然后每个节点的值比左右孩子都大于等于或小余等于
将一个无序序列构造成一个堆(大顶堆或者小顶堆),然后取出顶点上的值(要么是最大值,要么是最小值),将剩下的n-1个序列重新排成堆,得到次大值或者最小值,依次类推,最终得到一个有序的序列
2、复杂度分析
需要一定的辅助空间用于堆的创建
第i次取出堆顶元素后重新建堆的时间为logi,然后一共需要取n-1次堆顶元素,也需要重建堆n-1次,因此总的时间复杂度为O(nlogn),优于冒泡、简单选择、直接插入的时间复杂度

直接插入排序

1、思想
利用辅助空间,以空间换时间,将要比较的关键字插入到已排好的数组(辅助空间中的数组)中,先两个排到辅助数组中,然后插入第三个,依次类推
2、实现思路如上
3、复杂度分析
最坏情况下,数组是排好的逆序,这个时候比较次数为2+3+…+n-2+n-1,复杂度为O(n2),这时的移动次数为Σ(i+1)下标从2到n,时间复杂度为O(n2),但直接插入排序平均移动和比较的次数更小,因此性能比冒泡和简单排序更好

希尔排序

1、思想
希尔排序是在直接插入排序基础上更加高效的一种排序方式,该算法不断选取越来越小的增量将整个数组分成若干个小组,然后在每个小组中进行直接插入排序,再将这些小组合起来又重新进行增量分组,直到增量为1为止,此时所有的数字都被排成一个有序组了
2、复杂度分析
时间复杂度为O(n3/2),优于O(n2),但该算法不稳定

归并排序(分治算法)

1、思想
将长度为n的序列两两分割为[n/2]d个子序列,每个子序列排好序后两两归成个数减半、长度增倍的子序列,直到得到一个长度为n的有序序列为止
2、复杂度分析
首先需要长度为n的辅助空间记录原始序列,然后需要深度为log2n的栈空间,因此总的空间复杂度为O(n+logn);把这n个序列的归并排序过程看成一个完全二叉树,所以一共需要log2n次归并归并排序,然后就是每次归并时要比较扫描n次,因此一次归并排序的时间复杂度为O(n),故总的时间复杂度为O(nlogn)
归并顺序是一种稳定高效的排序算法,但是比较占用内存

原创粉丝点击