作者:guiyinzhou
时间:二零一零年六月十八日
排序技术一直以来是算法里面的一个核心部分,排序分为内部排序和外部排序,本文主要阐述内部排序十大关键技术。这些排序技术是学习时的重点,也是笔试和面试时常考的知识点,此篇博文是笔者学习时所整理的,由于能力有限,不足和错误之处望指正!话不多说,上算法,本文所给出的排序算法技术内容包括排序算法思想,示意图解析,C++源代码和算法复杂度简单分析。
为了统一叙述风格,在此篇文章中,要排序的元素均被存放在一个数组中,存放位置从下标1开始,一直到length。
一、插入排序算法
算法思想:对于一个有N个记录的待排序的序列,整个排序过程为进行N -1趟插入。先将表中的第一个记录看成一个有序的子序列,然后从第二个记录起逐个查找合适的位置进行插入,以此类推,此排序过程就是将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。一个比较直观的比喻就是像我们平时玩扑克牌,在你手里的牌是你经过排序的,是一个有序的序列,之后从桌子上每抓一张牌,你都会将它插入到合适的位置用来保证牌得有序性,知道所有的牌抓完为止。
示意图解析:
示意图中绿色的区域代表有序区,白色的部分是无序区,插入排序算法的过程就是将无序区的第一个元素插入到有序区合适的位置,知道整个数组均为有序区。
C++源码:
算法复杂度分析:复杂度均为O(n2),稳定排序。
二、归并排序算法
算法思想:它主要采用了分冶的思想,通过递归的方式不断的将两个有序的子序列归并成一个有序序列,直到整个序列有序为止。该算法中每一层递归包括三个操作,分解(将n个元素分成n/2个元素的子序列)、解决(用归并排序法对两个子序列递归地排序)和合并(合并已经有序的子序列得到上层递归调用的排序结果)。
示意图解析:
设待排序的数组A[1]....A[7],则归并排序的操作过程如下所示
C++源码:
算法复杂度分析:复杂度均为O(nlogn),稳定排序。