归并排序:归并排序的原理,分治思想的经典应用
归并排序基于“分而治之”思想,核心是分解、递归、合并。先将数组递归拆分为长度为1的子数组,再通过双指针合并相邻有序子数组(比较元素大小,临时数组存储结果)。完整流程:分解至最小子数组,逐层合并成有序数组。 时间复杂度稳定为O(n log n)(递归深度log n,每层合并需遍历所有元素),空间复杂度O(n)(需临时数组存储合并结果)。作为稳定排序,相等元素相对顺序不变,适合大数据量或需稳定排序的场景。其“分解-合并”逻辑直观体现分治思想,是理解递归与复杂问题简化的经典案例。
阅读全文使用C++实现桶排序算法
桶排序是一种非比较型排序算法,通过将待排序元素分配到多个“桶”中,对每个桶内元素单独排序后合并,实现整体排序。核心是合理划分桶,使每个桶元素数量少,降低排序成本。 以[0,1)范围内的浮点数为例,算法步骤:1. 创建n个空桶(n为数组长度);2. 按元素x的桶索引x*n(取整数部分)分配到对应桶;3. 各桶内用std::sort排序;4. 合并所有桶元素。 C++实现中,`bucketSort`函数通过vector<vector<double>>创建n个桶,遍历元素分配,排序后合并。测试验证了算法正确性。 复杂度:平均时间O(n)(元素均匀分布时),最坏O(n log n)(所有元素入同一桶);空间O(n)。适用于数据分布均匀、范围明确的数值型数据,数据不均时性能退化。 该算法在数据分布合理时高效,尤其适合统计分析中的区间数据排序。
阅读全文使用C++实现希尔排序算法
希尔排序是插入排序的改进版,又称“缩小增量排序”,通过分组插入排序并逐步缩小增量实现高效排序。基本思路:选定初始增量`gap`(如数组长度的一半),按`gap`分组(子序列元素间隔`gap`),对各组子序列插入排序;重复缩小`gap`(通常减半),直至`gap=1`完成整体排序。 核心原理:大`gap`时分组减少移动次数,小`gap`时数组已部分有序,大幅降低最终插入排序的移动量。以数组`[12,34,54,2,3]`为例,初始`gap=2`分组排序后数组渐趋有序,再`gap=1`完成最终排序。 代码通过三层循环实现:外层控制`gap`,中层遍历分组,内层移动元素。时间复杂度平均`O(n^1.3)`(依赖增量),最坏`O(n²)`,空间复杂度`O(1)`,不稳定。希尔排序通过分组优化插入排序,适用于较大数组,核心逻辑为“分组→排序→缩小增量→最终排序”。
阅读全文使用Java实现选择排序算法
选择排序是一种简单直观的排序算法,核心思想是每次从无序部分选取最小(或最大)元素,放入已排序部分末尾,重复此过程直至全部有序。其基本思路为:外层循环确定已排序部分的末尾位置,内层循环在未排序部分中寻找最小值,交换该最小值与外层循环当前位置的元素,直至完成排序。 Java实现中,`selectionSort`方法通过两层循环实现:外层循环遍历数组(`i`从0到`n-2`),内层循环(`j`从`i+1`到`n-1`)寻找未排序部分的最小值索引`minIndex`,最后交换`i`位置元素与`minIndex`位置元素。以数组`{64,25,12,22,11}`为例,每轮交换后逐步构建有序数组,最终结果为`[11,12,22,25,64]`。 时间复杂度为O(n²),适用于小规模数据。该算法逻辑简单、代码易实现,是理解排序基础思想的典型示例。
阅读全文