Chinaunix首页 | 论坛 | 博客
  • 博客访问: 899052
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-09-15 16:00:04

一、重要概念:
内部排序 VS 外部排序
内部排序:整个过程完全在内存中进行的排序。
外部排序:由于待排序的记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储
                 设备才能完成的排序。
稳定排序 VS 不稳定排序
稳定性是排序算法的一种特性。有些排序算法是稳定的,有些排序算法不是稳定的。如果待排序
的元素中有两个元素关键字相同,如果排序后算法能保证其顺序不会变化则说明该算法是稳定的,
反之,该算法是不稳定的。
----------------------------------------------------------------------------------------
二、内部排序的分类。
1,交换类排序。(冒泡排序,快速排序)
2,选择类排序。(简单选择排序,堆排序)
3,插入类排序。(直接插入排序,折半插入排序,希尔排序)
4,归并类排序。(归并排序)。
-----------------------------------------------------------------------------------------
三、排序算法分析与比较。
3.1,交换类排序。

冒泡排序

    最坏的情况是待排序的记录是逆序的,此时,每一趟冒泡排序需要进行i次比较,3i次移动。
一共有n-1趟, 因此该算法的时间复杂度为O(n^2),空间复杂度为O(1),冒泡排序算法是稳定
的排序算法。

快速排序

     快速排序最好的情况是每次将待排序的记录都等分为二,此时时间复杂度为O(nlog2^n)。
最坏情况下,待排序记录已经排好序,此时总共的比较次数为n(n-1)/2,此时时间复杂度为O(n^2)。
     快速排序的时间复杂度为O(nlogn),空间复杂度为O(log2^n),它是一种不稳定的排序算法。
举反例如下:待排序序列为{3,2,(2)},则一趟排序后记录为{(2),2,3}。
           
3.2,选择类排序。

简单选择排序

无论待排序记录的初始排列如何,简单选择排序总的比较次数总为n(n-1)/2,因为它每趟比较的
次数为n-i,i的范围从1到n-1。最好的情况下,简单选择排序算法的移动次数为0,最坏情况下
移动的3(n-1)。

简单选择排序算法的时间复杂度为O(n^2),空间复杂度为O(1),它是不稳定的排序算法。举反例如下:
待排序记录为{6,8,(6),2,7},一趟排序后记录为{2,8,(6),6,7},二趟排序后记录为{2,(6),8,6,7}。

选择排序的过程:(用{6,8,(6),2,7}为例子)
{6,8,(6),2,7}
{2,8,(6),6,7}
{2,(6),8,6,7}
{2,(6),6,8,7}
{2,(6),6,7,8}

堆排序:
堆排序是种比较重要的排序方法,在工程应用中用的比较广,在内核中的排序都是用的堆排序。
堆排序的时间复杂度为O(nlogn)。而且是不稳定的排序算法。

3.3,插入类排序。

直接插入排序

如果待排序记录之间是顺序排列,此时整个排序过程中元素比较的次数为n-1次,移动次数为0次。
如果待排序记录 之间是逆序排列,第i趟排序比较次数为i,移动的次数为i+1,其中i的范围是2到n。
因此,整个排序过程中元素的比较次数为(n+2)(n-1)/2, 移动次数为(n+4)(n-1)/2。

直接插入排序算法的时间复杂度为O(n^2),空间复杂度为O(1)。从直接插入排序算法的实现可以
发现,位置靠后的记录是不可能插入到相同大小的记录之前的,因此直接插入排序算法是稳定的。

直接插入排序的过程:(用{6,8,(6),2,7}为例子)
{6,8,(6),2,7}
{6,8,(6),2,7}
{6,(6),8,2,7}
{2,6,(6),8,7}
{2,6,(6),7,8}

折半插入排序

折半插入排序算法与直接插入排序算法相比,每趟的比较次数为log2^i,因此整体的比较次数为
O(nlog2^n)。但是折半算法的移动次数较直接插入算法并未改变。

折半算法的时间复杂度仍然是O(n^2),空间复杂度为O(1)。从算法实现可以看出折半插入排序算法
是稳定的。

希尔排序

希尔排序利用了当“待排序记录n较小,序列基本有序”时使用直接插入算法性能较好这一特点而改进。
希尔排序算法的时间复杂度为O(n^1.5),空 间复杂度为O(1),它是不稳定的排序算法。举反例如下:
待排序序列为{2,4,1,(2)},设delta[1]=2,则一趟排序后序列为{1, (2),2,4}。

---------------------------------------------------------------------------------------------
四、总结


参考:http://edsionte.com/techblog/archives/3857
阅读(848) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~