返回

极速通关常见排序算法

前端

在计算机科学领域,排序算法是基础而重要的算法,广泛应用于数据处理、科学计算和人工智能等众多领域。本文将深入浅出地介绍九种常见的排序算法,包括选择排序、冒泡排序、快速排序、归并排序、桶排序、计数排序、基数排序、堆排序和插入排序。

选择排序

选择排序是一种简单直观的排序算法,适用于规模较小的数据集。其基本思路是在无序序列中选择最小的元素(升序)或最大的元素(降序),并将其与序列的第一个元素交换,随后在剩余的无序序列中重复此过程,直至整个序列有序。

例如,考虑序列[5, 3, 1, 2, 4]的升序排序。选择排序首先找出最小的元素1,并将其与第一个元素5交换,得到序列[1, 5, 3, 2, 4]。接着,在剩余的序列[5, 3, 2, 4]中继续查找最小的元素,即2,并将其与第二个元素5交换,得到序列[1, 2, 5, 3, 4]。以此类推,最终得到有序序列[1, 2, 3, 4, 5]。

冒泡排序

冒泡排序是一种更为简单的排序算法,同样适用于规模较小的数据集。其基本思路是将相邻元素逐一对调,使较小的元素逐渐沉降到序列底部(升序)或顶部(降序)。重复此过程,直到序列完全有序。

考虑序列[5, 3, 1, 2, 4]的升序排序。冒泡排序首先比较相邻元素5和3,发现5大于3,因此将其交换,得到序列[3, 5, 1, 2, 4]。接着,比较相邻元素3和5,发现3小于5,无需交换。继续比较序列中的相邻元素,直到遍历完整序列。此时,最大的元素5沉降到序列底部,而序列前部[3, 1, 2, 4]仍处于无序状态。重复此过程,最终得到有序序列[1, 2, 3, 4, 5]。

快速排序

快速排序是一种基于分治思想的排序算法,平均时间复杂度为O(n log n),适用于规模较大的数据集。其基本思路是选择一个基准元素,将序列划分为两部分:一部分包含小于或等于基准元素的元素,另一部分包含大于基准元素的元素。接着,对两部分分别进行快速排序,直到序列完全有序。

考虑序列[5, 3, 1, 2, 4]的升序排序。快速排序首先选择基准元素5,将序列划分为两部分:[3, 1, 2, 4]和[]。随后,对两部分分别进行快速排序。对第一部分[3, 1, 2, 4]进行快速排序,选择基准元素2,将序列划分为[1, 3]和[4]。对第二部分[]进行快速排序,无需进一步划分。对[1, 3]继续进行快速排序,选择基准元素1,将序列划分为[]和[3]。对[3]继续进行快速排序,选择基准元素3,将序列划分为[]和[3]。至此,序列[3, 1, 2, 4, 5]完全有序。

归并排序

归并排序是一种基于分治思想的排序算法,平均时间复杂度为O(n log n),适用于规模较大的数据集。其基本思路是将序列拆分为多个较小的子序列,对每个子序列进行归并排序,再将排好序的子序列逐个合并,直到整个序列有序。

考虑序列[5, 3, 1, 2, 4]的升序排序。归并排序首先将序列拆分为两个子序列[5, 3]和[1, 2, 4]。对这两个子序列分别进行归并排序,得到有序的子序列[3, 5]和[1, 2, 4]。接着,将这两个有序的子序列合并,得到有序的序列[1, 2, 3, 4, 5]。

桶排序

桶排序是一种非比较型排序算法,适用于数据分布相对均匀的数据集。其基本思路是将序列划分为多个桶,每个桶负责存储一定范围内的元素。将序列中的元素分别放入对应的桶中,对每个桶内的元素进行排序,最后将所有桶中的元素合并,即可得到有序序列。

考虑序列[5, 3, 1, 2, 4]的升序排序。桶排序首先将序列划分为5个桶,每个桶负责存储范围为[0, 1]、[1, 2]、[2, 3]、[3, 4]和[4, 5]的元素。将序列中的元素分别放入对应的桶中,得到桶[0, 1]: [], 桶[1, 2]: [1, 2], 桶[2, 3]: [3], 桶[3, 4]: [4], 桶[4, 5]: [5]。对每个桶内的元素进行排序,得到桶[0, 1]: [], 桶[1, 2]: [1, 2], 桶[2, 3]: [3], 桶[3, 4]: [4], 桶[4, 5]: [5]。最后,将所有桶中的元素合并,即可得到有序序列[1, 2, 3, 4, 5]。

计数排序

计数排序是一种非比较型排序算法,适用于数据范围有限的数据集。其基本思路是统计序列中每个元素出现的次数,根据出现的次数计算每个元素在有序序列中的位置,最后将元素按顺序输出。

考虑序列[5, 3, 1, 2, 4]的升序排序。计数排序首先统计序列中每个元素出现的次数,得到计数数组[0, 1, 1, 1, 1, 1]。根据计数数组,计算每个元素在有序序列中的位置,得到位置数组[1, 2, 3, 4, 5, 6]。最后,将元素按顺序输出,得到有序序列[1, 2, 3, 4, 5]。

基数排序

基数排序是一种非比较型排序算法,适用于数据范围有限且数据分布均匀的数据集。其基本思路是将元素按照从低位到高位逐个排序,每一位排序完成后再进行下一位的排序,直至所有位排序完成。

考虑序列[5, 3, 1, 2, 4]的升序排序。基数排序首先将序列按照个位进行排序,得到序列[1, 3, 2, 5, 4]。接着,按照十位进行排序,得到序列[1, 2, 3, 4, 5]。至此,序列完全有序。

堆排序

堆排序是一种基于堆数据结构的排序算法,平均时间复杂度为O(n log n),适用于规模较大的数据集。其基本思路是将序列构建成一个大根堆或小根堆,堆顶元素就是序列的最大值或最小值。将堆顶元素与序列末尾元素交换,并重新调整堆的结构,继续重复此过程,直到序列完全有序。

考虑序列[5, 3, 1, 2, 4]的升序排序。堆排序首先将序列构建成一个小根堆,得到堆结构[1, 2, 3, 4, 5]。将堆顶元素1与序列末尾元素5交换,得到序列[1, 2, 3, 5, 4]。重新调整堆的结构,得到堆结构[1, 2, 3, 5, 4]。继续重复此过程,最终得到有序序列[1, 2, 3, 4, 5]。

插入排序

插入排序是一种简单直接的排序算法,适用于规模较小的数据集。其基本思路是将序列逐个元素插入到已排好序的部分,使整个序列逐渐有序。

考虑序列[5, 3, 1, 2, 4]的升序排序。插入排序首先将序列的第一个元素5视为已排好序的部分,将第二个元素3插入到已排好序的部分,得到序列[3, 5]。接着,将第三个元素1插入到