排序算法

来源:互联网 发布:财富证券交易软件下载 编辑:程序博客网 时间:2024/06/07 00:03

在总结排序算法前,先了解几个概念:
1.稳定和非稳定排序
通俗而言,指的是有相同值的几个值,在排序前后其相对性位置保持不变(前后关系),如果保持不变就是稳定的。如果发生了该改变,就是不稳定的。
如冒泡排序5 8 5 2 1 就是稳定的。
如选择排序5 8 5 2 1 =>1 8 5 2 5 就改变了位置关系,则是不稳定的。

稳定排序:插入排序/冒泡排序/归并排序/基数排序
不稳定排序:选择排序/快速排序/堆排序

一.快速排序
  快速排序的思想是分治法。
  快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
  但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法[1]。
分析[2]:
  快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
  最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)
  在最好情况下,每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)
  尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。
  一个经典通俗易懂的快排解析http://blog.csdn.net/morewindows/article/details/6684558 
  
二.归并排序
特点:采用分治法解决排序问题,先递后合
稳定/需要一块与N序列相同大小的辅助内存o(n)。
(1)
  最坏情况O(nlogn)
  最好情况O(nlogn)
三.堆排序
利用堆的数据结构,堆是一个近似完全二叉树的结构,并同时满足堆性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

四.选择排序
  选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,与序列首地址存放的数进行交换,以此类推,直到所有元素均排序完毕。
  简而言之,一次遍历能找到一个已经排好的值。是一种稳定的排序。
  最好情况O(n^2)
  最坏情况O(n^2)
五.冒泡排序
需要比较的次数为1+2+…+n,时间复杂度O(n^2)
六.插入排序
  通过构建有序序列,对于未排序数据,在已排序序列从后向前扫描,找到相应的位置并插入。
  最坏情形:输入数列是倒序排序,时间复杂度O(n^2),9,8,7,6,5,4,3,2,1,0
  最好情形:输入数列是正序排序或者“近似排序”,时间复杂度O(n),0,1,2,3,4,5,6,7,8,9
  平均情况,事件复杂度为O(n^2)
空间复杂度:O(1)
是稳定的算法

希尔排序是插入排序的一种,希尔排序过程如下图所示
希尔排序
在对每个分组进行排序时,是采用直接插入排序的排序方法。步长的选择是希尔排序中的重要组成部分。
在上面这幅图中:
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。
接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了。所以,希尔排序是不稳定的算法。

基数排序
参考文献:
一.快排:
1.http://www.cnblogs.com/luchen927/archive/2012/02/29/2368070.html#!comments
2. http://blog.csdn.net/morewindows/article/details/6678165
二.归并
1.http://blog.csdn.net/morewindows/article/details/6678165

0 0
原创粉丝点击