数据结构中的排序技术2025年3月17日 | 阅读20分钟 引言排序是计算机科学中的一项基本操作,它包括将一组对象按特定顺序排列。它广泛应用于数据库管理、数据分析和搜索等许多不同领域。在数据结构中,采用不同的排序技术来高效地组织和操作大量数据。 排序技术有各种排序技术,列在下表中
冒泡排序称为“冒泡排序”的简单排序方法会分析相邻的元素,迭代地遍历列表,并交换任何不按顺序排列的元素。要对整个列表进行排序,请重复此步骤。 示例 让我们考虑一个整数数组:{5, 2, 8, 12, 3}。
程序说明 bubbleSort 函数接受一个数组(arr)及其大小(size)作为输入。它使用嵌套循环遍历数组并比较相邻元素。 如果当前元素大于下一个元素,则执行交换。此过程重复进行,直到最大元素“冒泡”到数组末尾。 在 main 函数中初始化一个名为 arr 的数组,并使用 sizeof 运算符确定数组的大小。 然后调用 bubbleSort 函数,传入数组及其大小。 程序输出 ![]() 选择排序选择排序是一种使用原地比较的排序算法。它将输入数组分为两部分:已排序部分和未排序部分。在每次迭代中,算法从该部分的未排序部分选择最小(或最大)元素,并将其插入到该部分的已排序部分的开头。 示例 考虑相同的整数数组:{5, 2, 8, 12, 3}。
程序说明 selectionSort 函数接受一个数组(arr)及其大小(size)作为输入。它使用嵌套循环遍历数组。内层循环在数组的剩余未排序部分中搜索最小元素,而外层循环选择当前成员。 当内层循环完成时,外层循环的当前元素与最小元素交换。这样做可确保最小元素被移至排序中的正确位置。 在 main 函数中初始化一个名为 arr 的数组后,使用 sizeof 运算符确定数组的大小。然后调用 selectionSort 函数,传入数组及其大小。 程序输出 ![]() 插入排序插入排序是一种简单的排序算法,它一次构建一个完成的排序数组。一次一个元素,迭代地考虑输入数组,将其插入数组的已排序部分中的正确位置。 示例 让我们使用相同的整数数组:{5, 2, 8, 12, 3}。
程序说明 insertionSort 函数接受数组 arr 及其大小 size 作为输入。它开始将数组已排序部分的元素与第二个元素(i = 1)进行比较。然后它向后(j = i - 1)遍历已排序部分,如果元素大于键值,则将它们向右移动。 内部 while 循环继续,直到 j 变为负数或索引 j 处的元素不大于键。此循环将元素向右移动,为键值在其正确的排序位置腾出空间。 while 循环之后,键值将被插入到排序位置(arr[j + 1] = key)。数组的元素一次处理一个,直到所有元素都已处理。 在 main 函数中初始化名为 arr 的数组后,使用 sizeof 运算符确定数组的大小。然后调用 insertionSort 函数,传入数组及其大小。 程序输出 ![]() 合并排序归并排序是一种分治算法,它将输入数组分成更小的子数组,对它们进行排序,然后将它们合并以产生已排序的输出。它使用“合并”操作将较小的已排序子数组合并成一个较大的已排序数组。 示例 考虑整数数组:{5, 2, 8, 12, 3}。
程序说明 mergeSort 函数递归地将数组分成更小的子数组,直到每个子数组只包含一个元素。数组被 mergeSort 函数反复分成更小的子数组,直到每个子数组只包含一个元素。 然后通过按排序顺序比较和组合它们的组件来合并子数组。 merge 函数使用两个已排序的子数组将它们合并成一个已排序的数组。它比较两个子数组的组件,并将它们按原始数组的正确顺序排列。 在 main 方法中初始化一个数组,然后使用 mergeSort 函数对其进行排序。最后打印排序后的数组。 程序输出 ![]() 快速排序另一种分治技术,它根据枢轴元素对数组进行分区。它选择一个枢轴并重新排列数组的组件,使得靠近枢轴的组件放在前面,远离枢轴的组件放在后面。这些子数组一遍又一遍地重复此过程,直到整个数组排序完成。 示例 使用整数数组:{5, 2, 8, 12, 3}。 算法选择一个枢轴元素,该元素可以通过多种方式选择(例如,数组中的最后一个元素)。
程序说明 partition 函数选择数组中的最后一个元素作为枢轴,并重新排列数组的组件,使得所有小于枢轴的元素都移到左边,所有大于枢轴的元素都移到右边。它返回枢轴元素的索引。 quickSort 函数通过选择枢轴、对数组进行分区以及递归排序子数组来递归应用快速排序算法。当子数组大小为 1 或更小时停止。 在 main 函数中初始化一个数组,然后使用 quickSort 函数对其进行排序。最后打印排序后的数组。 程序输出 ![]() 堆排序堆排序是一种基于比较的排序算法,它使用堆数据结构来高效地以升序或降序对元素进行排序。它通过将数组转换为二叉堆并反复从堆中提取最大(升序)或最小(降序)元素,直到数组完全排序。 下面使用一个好的例子来解释堆排序算法 考虑一个数字数组:[9, 7, 5, 2, 1, 8, 6, 3, 4]。 1. 构建最大堆:我们首先需要从给定的数组创建一个二叉堆。从最后一个非叶节点 (n/2-1) 开始,我们堆化数组,使最大元素始终位于根。在这种情况下,最后一个非叶节点位于索引 4。 [9, 7, 5, 2, 1, 8, 6, 3, 4](原始数组) [9, 7, 6, 4, 1, 8, 5, 3, 2](堆化后) 2. 交换根与最后一个元素:将根(即第一个元素)与堆的最后一个元素交换。在这种情况下,交换索引 0 和索引 8。 [2, 7, 6, 4, 1, 8, 5, 3, 9](交换后) 3. 减小堆的大小:将堆大小减 1,并对根元素(现在位于索引 0)进行堆化。这将把下一个最大元素移到根。 [8, 7, 6, 4, 1, 2, 5, 3, 9](堆化后) 4. 重复步骤 2 和 3:直到堆大小为 1,根据需要重复步骤 2 和 3。每次迭代后,最大元素将移到数组的末尾。 [7, 4, 6, 3, 1, 2, 5, 8, 9] [6, 4, 5, 3, 1, 2, 7, 8, 9] [5, 4, 2, 3, 1, 6, 7, 8, 9] [4, 3, 2, 1, 5, 6, 7, 8, 9] [3, 1, 2, 4, 5, 6, 7, 8, 9] [2, 1, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] 数组现在按升序排序。 程序说明 heapify 函数比较节点与其左子节点和右子节点,并在必要时将其与较大的子节点交换,确保最大堆属性。 heapSort 函数从数组构建最大堆,然后通过将其与最后一个元素交换、减小堆大小并调用 heapify 来维护最大堆属性来反复提取最大元素。 在 main 函数中初始化一个数组,并使用 heapSort 对数组进行排序。然后打印排序后的数组。 程序输出 ![]() 计数排序计数排序是一种线性排序方法,它根据计数或频率来排列元素。对于具有已知最大值的非负整数范围,它效果很好。计数排序不包含任何比较操作,它比许多其他排序算法更快。 示例 让我们考虑一个整数数组作为我们的输入:[4, 2, 5, 1, 3, 4, 2, 4]。我们假设输入值的范围是 1 到 5。
程序说明 我们找到数组中的最大元素以确定元素的范围。然后创建一个计数数组,将其所有项初始化为 0,并给它一个大小(max + 1)。计数数组应遍历输入数组,增加每个条目的计数。 然后,应更新计数数组以存储条目总数。该元素表示小于或等于元素索引的元素数量。 应创建与输入数组大小相同的临时数组。 反向遍历输入数组。使用计数数组,将每个元素放置在临时数组中其应有的位置。 要创建已排序的数组,请将临时数组中的条目复制回输入数组。 程序输出 ![]() 基数排序基数排序是一种非比较排序算法,它根据数字或位来排列对象。它通过将元素按每个有效数字或位分组,然后反复将它们分发到不同的存储桶中来工作。如果整数、字符串或其他数据类型可以表示为数字或位的序列,则可以应用基数排序。 示例 让我们考虑一个整数数组作为输入:[170, 45, 75, 90, 802, 24, 2, 66]。我们将使用十进制基数排序,它根据数字从最低有效位到最高有效位对元素进行排序。
程序说明 getMax 函数查找数组中的最大元素以确定最大位数。 countingSort 函数使用计数数组,根据特定数字(由 exp 确定)执行计数排序。它计算每个数字的计数,然后确定输出数组中数字的位置。 从最低有效数字到最高有效数字,radixSort 函数为每个数字位置执行计数排序。 printArray 函数打印数组的项。 在 main 函数中,初始化一个数组,并打印其原始内容。 通过调用 radixSort 函数使用基数排序对数组进行排序。 最后打印排序后的数组。 程序输出 ![]() 桶排序桶排序是一种排序算法,它根据输入元素的取值范围将它们分成不同的“桶”,然后分别对每个桶中的元素进行排序。当输入数字均匀分布在一个范围内时,它效果最好。 桶排序可以分两步完成:分发和收集。分发步骤将元素放入相应的桶中,收集步骤将来自桶的元素合并以获得排序后的数组。 示例
程序说明 创建一个空桶数组,其中每个桶代表一个值范围。 根据其值将输入数组中的每个元素放入适当的桶中。桶索引通过将元素乘以桶的数量来确定。 对每个桶中的元素进行排序。在此代码中,使用 std::sort 函数对元素进行排序。 从桶中按正确的顺序收集元素。在迭代遍历每个桶之后,将已排序的元素添加到输出数组中。 main 函数初始化一个浮点数输入数组。 最后,打印排序后的数组。 程序输出 ![]() 下一个主题在二叉搜索树中查找顺时针数组 |
我们请求您订阅我们的新闻通讯以获取最新更新。