排序算法gydF4y2Ba
一个gydF4y2Ba排序算法gydF4y2Ba是一系列的指令,需要一个的由一个算法gydF4y2Ba大批gydF4y2Ba为输入,执行指定的操作在阵列上,有时被称为一个列表,并且输出排序后的数组。排序算法通常在计算机科学课程早教,因为它们提供一个简单的方法来引入其他关键的计算机科学类的话题gydF4y2Ba大O符号gydF4y2Ba,gydF4y2Ba分治法gydF4y2Ba方法和数据结构,例如gydF4y2Ba二叉树gydF4y2Ba, 和gydF4y2Ba堆gydF4y2Ba.有许多因素要考虑,当gydF4y2Ba选择排序算法gydF4y2Ba使用。gydF4y2Ba
内容gydF4y2Ba
排序算法gydF4y2Ba
换句话说,一个排序后的数组是一个数组,它是在一个特定的顺序。例如,gydF4y2Ba 按字母顺序排序,gydF4y2Ba 是一个整数列表排序按升序排列,并gydF4y2Ba 在递减顺序排序整数列表。gydF4y2Ba
排序算法接受一个数组作为输入,输出一个数组gydF4y2Ba排列gydF4y2Ba的被排序的该阵列。gydF4y2Ba
有两大类排序算法:gydF4y2Ba整数类型gydF4y2Ba和gydF4y2Ba比较排序gydF4y2Ba.gydF4y2Ba
比较排序gydF4y2Ba
比较排序在算法的每一步对元素进行比较,以确定一个元素应该在另一个元素的左边还是右边。gydF4y2Ba
比较排序通常更简单的整数比各种实现,但是比较排序由下限的限制gydF4y2Ba ,这意味着,平均而言,比较排序不能比gydF4y2Ba .算法的下界是gydF4y2Ba最差的情况gydF4y2Ba运行时间gydF4y2Ba最好的事物gydF4y2Ba给定问题的可能算法。这里的“平均”部分很重要:如果输入的列表是快速的,那么有许多算法会运行得非常快gydF4y2Ba已经gydF4y2Ba排序,或者有一些非常特殊(总体上不太可能)的属性。列表中只有一种排序,但是gydF4y2Ba 可能的列表,这样的机会,输入已经排序是非常不可能的,而且平均而言,列表不会被非常排序。gydF4y2Ba
的基于比较的排序算法的运行时间为界gydF4y2Ba .gydF4y2Ba
比较排序可以建模为一个大gydF4y2Ba二叉树gydF4y2Ba称为决策树,其中每个节点代表一个单独的比较。因为排序列表是输入列表的某种排列,对于一个长度的输入列表gydF4y2Ba ,有gydF4y2Ba 可能的排列。这是一个决策树,因为每一个gydF4y2Ba 是由一个叶节点表示的,而算法到达每个叶节点所必须采取的路径是产生特定顺序的一系列比较和结果。gydF4y2Ba
在树的每一层,都会进行比较。比较发生了,我们继续沿着树向下移动;在算法到达树的叶子之前,每个排列都会有一个叶子,所以有gydF4y2Ba 叶子。gydF4y2Ba
每个比较半部算法必须做未来的比较的数量(因为如果该算法选择右边缘出在给定步骤的一个节点的,它不会搜索连接到左边缘的节点和路径)。因此,该算法执行gydF4y2Ba 比较。任何二进制树,高度gydF4y2Ba ,具有多个叶片,其小于或等于gydF4y2Ba .gydF4y2Ba
从这个,gydF4y2Ba 以gydF4y2Ba对数gydF4y2Ba结果gydF4y2Ba 从gydF4y2Ba斯特林近似gydF4y2Ba,gydF4y2Ba 所以,gydF4y2Ba
整数排序gydF4y2Ba
整数排序有时称为计数排序(尽管有一种特定的整数排序算法称为计数排序)。整数排序不进行比较,因此它们不受限制gydF4y2Ba .整数排序确定每个元件gydF4y2Ba 有多少元素小于gydF4y2Ba .如果有gydF4y2Ba 小于的元素gydF4y2Ba ,然后gydF4y2Ba 将被放置在所述gydF4y2Ba 投币口。此信息用于每个元素放入正确的插槽立即,无需要重新安排列表。gydF4y2Ba
排序算法的性能gydF4y2Ba
所有排序算法的目标都是输出一个已排序的列表,但每个算法执行这个任务的方式可能不同。在使用任何一种算法时,了解它的运行速度和运行空间是很重要的——换句话说,就是它gydF4y2Ba时间复杂度gydF4y2Ba和gydF4y2Ba空间复杂度gydF4y2Ba.如上节所示,基于比较的排序算法的时间复杂度为gydF4y2Ba ,这意味着算法不能比gydF4y2Ba .然而,通常,算法的运行时间是用大O来讨论的,而不是用。例如,如果一个算法在最坏情况下的运行时间是gydF4y2Ba ,则保证了算法永远不会比慢gydF4y2Ba ,如果一个算法的平均情况运行时间gydF4y2Ba ,那么平均而言,它不会比gydF4y2Ba .gydF4y2Ba
运行时间描述了一个算法在完成之前必须执行的操作数量。空间复杂度描述运行特定算法必须分配多少空间。例如,如果一个算法接受一个大小列表gydF4y2Ba ,并出于某种原因生成一个新的大小列表gydF4y2Ba 在每个元件gydF4y2Ba ,算法需要gydF4y2Ba 空间。gydF4y2Ba
另外,对于排序算法,它有时是有益的知道,如果一个排序算法是稳定的。gydF4y2Ba
稳定gydF4y2Ba
一个排序算法是稳定的,如果它保留具有相等的键值(其中键是值的算法通过排序)元素的原始顺序。例如,gydF4y2Ba
当卡片以稳定排序的值进行排序时,这两个5s必须在已排序的输出中保持它们原来的顺序。当它们以非稳定排序时,5在排序后的输出中可能以相反的顺序结束。gydF4y2Ba
常见的排序算法gydF4y2Ba
有许多不同的排序算法,各种利弊。下面是常见的排序算法的几个例子。gydF4y2Ba
归并排序是基于比较的算法,重点是如何合并在一起的两个预排序阵列,使得所得阵列也被排序。gydF4y2Ba
插入排序是基于比较的算法,在时间建立的最终排序后的数组的一个元素。它循环通过输入阵列和每次迭代去除一个元件,发现该元件的阵列中的所属的地方,然后放置在那里。gydF4y2Ba
冒泡排序是基于比较的算法,如果他们的顺序,直到整个阵列被分拣每对元素对进行比较以阵列和互换它们。对于列表中的每个元素中,该算法每对元件进行比较。gydF4y2Ba
快速排序是一种基于比较的算法,使用分治法对数组进行排序。算法选择一个主元,gydF4y2Ba ,然后将该重新排列阵列分成两个子阵列gydF4y2Ba ,这样所有元素都小于gydF4y2Ba , 和gydF4y2Ba ,以便所有元素都大于或等于gydF4y2Ba .gydF4y2Ba
堆排序是一种基于比较的算法,使用二进制堆数据结构对元素进行排序。它将输入分成一个有序区域和一个未排序区域,然后迭代地缩小未排序区域,通过提取最大的元素并将其移动到已排序区域。gydF4y2Ba
计数排序是一种整数排序算法,它假设每个gydF4y2Ba 列表中的输入元素的键值范围为gydF4y2Ba 来gydF4y2Ba ,对于一些整数gydF4y2Ba .对于列表中的每个元素,计数排序决定比它小的元素的数量。计数排序可以使用此信息将元素直接放置到输出数组的正确槽中。gydF4y2Ba
选择排序算法gydF4y2Ba
要选择一个特定的问题排序算法,考虑运行时间,空间复杂度,并输入列表的预期格式。gydF4y2Ba
算法gydF4y2Ba | 最好的gydF4y2Ba | 最差的情况gydF4y2Ba | 平均情况gydF4y2Ba | 空间复杂度gydF4y2Ba | 稳定吗?gydF4y2Ba |
归并排序gydF4y2Ba | 是的gydF4y2Ba | ||||
插入排序gydF4y2Ba | 是的gydF4y2Ba | ||||
冒泡排序gydF4y2Ba | 是的gydF4y2Ba | ||||
快速排序gydF4y2Ba | 最好的事物,gydF4y2Ba avggydF4y2Ba | 通常不是*gydF4y2Ba | |||
堆排序gydF4y2Ba | 不gydF4y2Ba | ||||
计数排序gydF4y2Ba | 是的gydF4y2Ba |
*大多数快速排序实现是不稳定的,尽管稳定的实现确实存在。gydF4y2Ba
当选择一个排序算法来使用,权衡这些因素。例如,快速排序是非常快速的算法,但可以是相当棘手的落实;冒泡排序是一个缓慢的算法,但很容易实现。小数据集进行排序,冒泡排序可能是一个更好的选择,因为它可以快速实施,但对于更大的数据集,从快速排序的加速可能是值得实现该算法的麻烦。gydF4y2Ba
另请参阅gydF4y2Ba
参考gydF4y2Ba
- , d ., &, w。gydF4y2Ba排序稳定性扑克牌gydF4y2Ba.检索2016年5月18日,从gydF4y2Bahttps://en.wikipedia.org/wiki/File:Sorting_stability_playing_cards.svggydF4y2Ba