引言:
排序算法是一种被广泛使用的算法,是计算机程序设计中的一种重要操作,在计算机软件领域发挥着重要的作用。它的功能是将任意序列的数据元素或记录重新按关键字顺序排列成有序的序列。 有序序列为记录的查找、插入和删除提供了方便,可以有效提高搜索效率。排数是一种抽象的通过简单过程对排序的表达,它将数据元素的任一序列,重新排列成一个关键有序的序列。本文的内容也将以数作为排序的关键字。
内部排序和外部排序:
我们在学习算法时提到的排序一般都是指的内部排序,内部排序就是指待排序列完全存放在内存中,可以在内存中完成的排序。但对于实际情况的需要来说,如云端、数据库等的存在,内部排序是远远不够的,这时候就涉及到外排序的使用。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。(从VB来看算法-排序 本文将以内排序为主。)
时间复杂度和空间复杂度:
排序算法具有通用性最终所达到的目的都是根据要求(如升降序)排出序列,但各种排序的算法各有优缺点,对于它们全面性能而言,目前很难提出一种被公认的最好的方法,通常会通过具体的情况和一个标准来选择一种排序算法做为主体,进行优化使用,判断一个排序算法优劣的标准一般为时间复杂度、空间复杂度和稳定性。
排序的稳定性:
当排序算法允许有相同的关键字记录时就会出现 “排序的稳定性” 这一相关问题。简单来说就在执行排序的过程中是否能够保证:相同关键字 之间的 相对位置不发生变化。 如:下列数组中 a0 和 a2 之间的相对位置。 这是执行了升序排列后得到的结果, 仅从结果来看 第一种排序稳定 第二种排序不稳定。
从实际的排序情况来看,在执行第一次外循环的排序过程中,冒泡排序排序稳定 ,选择排序a0 移到了a2 之后,所以选择排序是不稳定的。
对于排序的稳定性带来什么样的影响和好处,百度上较多的说法 “排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就 是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。“ (没有较多的实践和对比,不是很理解这段话的含义) 还好从别人的博客讨论中看到了这样一个通俗的情景以供大家理解:假如发奖学金,排在前三个的分别获一、二、三等奖,结果一排序把原来并列第二名的排成第三名了,他估计不会乐意。 这是在现实情景中排序稳定性对我们的影响。 这里还有一题可以具体运用,链接:http://www.rqnoj.cn/problem/43