《数据结构》和软考中都讲到了排序算法。对其进行了一下整理,与大家一起分享。
概念:
排序就是讲一组对象按照规定的次序重新排列的过程。
分类:
排序分为两大类:内部排序和外部排序。
内部排序:待排序的记录全部存放在计算机内存中进行的排序过程;
外部排序:待排序的记录数量很大,内存不能存储全部记录,需要对外存进行访问的排序过程。
重点讲解内部排序算法。分为插入排序、交换排序、选择排序、归并排序和分配排序。
插入排序的基本思想是将记录分为有序区和无序区,将无序区中的记录依次插入到有序区中,并保持有序。这里讲解直接插入排序和希尔排序。
直接插入排序的基本思想是依次将每个记录插入到一个已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
如图:
希尔排序的基本思想是先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
如图:
交换排序的基本思想是两两比较待排序的记录,当记录之间键值出现逆序时,则交换两个记录。包括冒泡排序和快速排序。
冒泡排序过程是首先将第一个记录的键值和第二个记录的键值进行比较,若为逆序(即R[1].key>R[2].key),则将这两个记录交换,然后继续比较第二个和第三个记录的键值。依次类推,直到完成第n-1个记录和第n个记录的键值比较交换为止。重复以上过程,当在一趟起泡过程中没有进行记录交换的操作时,整个排序过程终止。
如图:
快速排序,也称分治法,其基本思想是在n个记录中取某一个记录的键值为标准,通常取第一个记录键值为基准,通过一趟排序将待排的记录分为小于或等于整个键值和大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分记录的键值小,然后,对这两部分记录继续分别进行快速排序,以达到整个序列有序。
如图:
第一趟排序结束,然后对两边的记录继续分别进行同样的快速排序,以此类推直到排好序为止。
选择排序的基本思想是每次从待排序记录中选取键值最小或最大的记录放到适当位置。包括直接选择排序和堆排序。
直接选择排序又称简单选择排序,其基本思想是在第i次选择操作中,通过n-i次键值比较,从n-i+1个记录中选出键值最小的记录,并和第i个记录交换。
如图:
http://write.blog.csdn.net/postedit/48860001
堆排序是利用堆来选择最小(大)键值记录。
堆分为最小堆(小根堆)和最大堆(大根堆)。
实现堆排序需要解决两个问题:
1、如何由一个初始序列建成一个堆。
2、如何在输出堆顶元素之后调整剩下元素成为一个新堆。
建堆过程:
输出堆顶元素:
完整的堆排序过程:
归并排序的基本思想,将两个或两个以上的有序表合并成一个有序表。二路归并排序的基本思想是假设序列中又n个记录,可看成是n个有序的子序列,每个序列的长度为1。首先将每相邻的两个记录合并,得到[n/2]个较大的有序子序列,每个子序列包含2个记录,再将上述子序列两两合并,得到[[n/2]/2]个有序子序列,如此反复,直至得到一个长度为n的有序序列为止,排序结束。
如图:
分配排序的的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O(n)。这里主要讲基数排序。
基数排序的基本思想是:从低位到高位依次对Kj(j=d-1,d-2,…,0)进行箱排序。在d趟箱排序中,所需的箱子数就是基数rd,这就是"基数排序"名称的由来。
如图:
以上这些算法还涉及到稳定性与时间、空间复杂度。
小结:
清楚排序算法都有哪些,怎么分类。明白具体怎么实现。能够在实际生活中灵活选择和应用。这是我们学排序算法的目的。当然,在自考软考当中也涉及到了这部分内容并列入了重点,清楚了这些,考试也将变得so easy!