96SEO 2026-02-19 10:48 15
}
上周在生产环境遇到了这个问题,排查了2天才定位到原因。
今天分享一下完整的解决方案,希望帮大家避坑。
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: class="toc">d="M5,0
rgba(0,
文章目录
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
Sort)
算法分析
id="_4">
前言排序算法是编程入门的核心知识点,也是面试、笔试中的高频考点。
本文将系统讲解十种经典排序算法的核心原理,提供可直接运行的
id="1_7">1.算法描述
冒泡排序是一种简单的交换类比较排序算法,也是入门级的排序算法。
它的核心过程如同气泡从水底逐步上浮到水面,每一轮遍历都会将当前未排序部分的最大元素
id="2_9">2.核心思想
“已排序区间”(初始时已排序区间为空,未排序区间为整个数组);
后一个元素,交换两者位置;
后一个元素,交换两者位置;
到未排序区间的末尾,成为已排序区间的新起点;
src="https://i-blog.csdnimg.cn/direct/86dc3e8193194058aa73a0aa403e7165.gif#pic_center">
function">bubbleSort
class="token
punctuation">::
vectorclass="token
内层循环:每轮比较相邻元素,已排序的末尾无需再比较
class="token
punctuation">}
id="5_34">
5.算法优化默认的冒泡排序会固定遍历
false,说明数组已完全有序,直接终止算法,避免后续无效遍历。
function">bubbleSort
class="token
punctuation">::
vectorclass="token
内层循环:每轮比较相邻元素,已排序的末尾无需再比较
class="token
punctuation">}
O(n*n)
id="Selection_Sort_61">二、选择排序(Selection
id="1_62">
1.算法描述选择排序是一种简单的选择类比较排序算法,核心是
每一轮从未排序区间中精准选出最小(升序)或最大(降序)的元素,将其放到已排序区间的末尾,通过逐轮
“未排序区间”(初始为整个数组);
最大元素与未排序区间的第一个元素交换位置,此时该元素正式归入已排序区间;
src="https://i-blog.csdnimg.cn/direct/aca4083df137479896bc67a6efa2482f.gif#pic_center">
function">selectionSort
class="token
punctuation">::
vectorclass="token
punctuation">[
minIndexclass="token
punctuation">[
minIndexclass="token
punctuation">}
算法优化
选择排序的基础版本逻辑简单,优化空间有限,常见实用优化方向:
⌈n/2⌉,提升大规模数据的排序效率;
O(n*n)(无论是否有序,都要遍历找极值)
1],第一次交换会破坏相等元素的相对位置)
id="Insertion_Sort_97">三、插入排序(Insertion
id="1_98">
1.算法描述插入排序是一种简单的插入类比较排序算法,其核心逻辑模仿日常整理扑克牌的行为
“未排序区间”(剩余所有元素);
“待插入元素”,暂存该元素避免被覆盖;
等于待插入元素的位置(或遍历到已排序区间开头),将待插入元素放入腾出的空位,完成一次插入;
src="https://i-blog.csdnimg.cn/direct/76d6bce657ef464b9672e253168d229a.gif#pic_center">
function">insertionSort
class="token
punctuation">::
vectorclass="token
从第二个元素开始(第一个元素默认已排序)
class="token
punctuation">}
O(n*n)
id="Shell_Sort_132">四、希尔排序(Shell
id="1_133">
1.算法描述希尔排序(也称为
“缩小增量排序”)是插入排序的高效改进版本,核心思路是通过
减少数组的逆序度,解决普通插入排序对逆序元素移动次数多、效率低的问题。
它通过逐步缩小的
分别为一组);
时,数组已基本有序,此时执行一次普通插入排序(此时插入排序的时间复杂度接近
src="https://i-blog.csdnimg.cn/direct/092ed47b43444aa4a8ce7eda8e0cdc24.gif#pic_center">
function">shellSort
class="token
punctuation">::
vectorclass="token
punctuation">}
算法优化
希尔排序的性能核心取决于步长序列的选择,基础的
1,4,13,40…),能显著降低时间复杂度,是最常用的优化步长;
1,5,19,41,109…);
O(n^1.3)
id="Merge_Sort_173">五、归并排序(Merge
id="1_174">
1.算法描述归并排序是一种基于分治思想的比较排序算法,也是首个时间复杂度达到
“先分后合”:将待排序数组递归拆分为更小的子数组,直到子数组长度为
个元素(单个元素本身就是有序的);
将两个相邻的有序子数组合并为一个新的有序数组。
合并时通过双指针遍历两个子数组,依次选取较小(升序)的元素放入结果数组,最终将合并后的有序数组覆盖原数组对应区间。
src="https://i-blog.csdnimg.cn/direct/aedc8241a6d24cb192418cf6445a6170.gif#pic_center">
⚠️
踩坑记录:
我在实际项目中遇到过一个问题,这个配置在开发环境正常,但生产环境会报错。
后来发现是因为生产环境的版本不一致导致的。
建议大家在部署前一定要检查版本兼容性。
punctuation">::vector
class="token
punctuation">::
vectorclass="token
function">mergeSort
class="token
punctuation">::
vectorclass="token
function">mergeSort
class="token
function">mergeSort
class="token
function">mergeSort
class="token
punctuation">::
vectorclass="token
function">mergeSort
class="token
punctuation">}
右子数组的第一个元素,若成立则两个子数组已天然有序,无需执行合并操作;
n)
id="1_235">1.算法描述
快速排序是一种基于分治思想的原地比较排序算法,也是实际工程中应用最广泛的高效排序算法(被冠以
将数组划分为左右两部分(左部分≤基准值、右部分≥基准值),递归处理左右子数组,最终通过分区的收敛性实现整体有序(无需归并排序的
“排序后的正确位置”;
操作,直到子数组长度≤1(单个元素天然有序,递归终止);
src="https://i-blog.csdnimg.cn/direct/74bf6237c9f14432adbb567df8b13d90.gif#pic_center">
function">partition
class="token
punctuation">::
vectorclass="token
function">quickSort
class="token
punctuation">::
vectorclass="token
function">partition
class="token
function">quickSort
class="token
function">quickSort
class="token
function">quickSort
class="token
punctuation">::
vectorclass="token
function">quickSort
class="token
punctuation">}
id="5_276">
5.算法优化逆序数组导致的最坏情况;
O(n*n)(已排序数组,基准选最后一个)
id="1_287">
1.算法描述堆排序是一种基于堆数据结构的选择类比较排序算法,也是少数能同时实现
在正式排序前,需先明确堆的基础概念:堆是完全二叉树结构,满足
“小顶堆”(每个父节点≤子节点)的性质;数组可直接映射为完全二叉树(索引
src="https://i-blog.csdnimg.cn/direct/a6d2d84850df48d0862b73d126033497.jpeg#pic_center">
堆排序(升序)的核心步骤:
到数组末尾(已排序区间);
src="https://i-blog.csdnimg.cn/direct/6ea50fe12b244c398ff9a3af692b9fe5.gif#pic_center">
punctuation">::vector
class="token
punctuation">[
largestclass="token
punctuation">[
rightclass="token
punctuation">[
largestclass="token
punctuation">[
largestclass="token
punctuation">::
vectorclass="token
构建大顶堆(从最后一个非叶子节点开始)
class="token
punctuation">}
(n*logn));
递归版:O(logn)(递归栈空间);
id="Counting_Sort_338">八、计数排序(Counting
id="1_339">
1.算法描述计数排序是一种非比较类的线性时间排序算法,也是入门级的
的排序算法。
其核心逻辑并非通过元素间的比较实现排序,而是通过统计数组中每个元素的出现次数,再根据元素值的大小顺序重新填充数组
id="2_341">
2.核心思想计数排序的前提是:待排序元素为整数,且元素值的范围(记为
1(用于确定计数数组的长度);
minVal,避免负数索引);
的元素总数”,该值可直接确定对应元素在有序数组中的最终位置;
src="https://i-blog.csdnimg.cn/direct/3258c2919e8b497f9de8c8a2a0496fe2.gif#pic_center">
function">countingSort
class="token
punctuation">::
vectorclass="token
function">max_element
class="token
function">min_element
class="token
punctuation">::
vectorclass="token
punctuation">(
rangeclass="token
punctuation">{
countclass="token
punctuation">{
countclass="token
punctuation">{
outputclass="token
punctuation">[
countclass="token
punctuation">;
countclass="token
punctuation">}
k)
id="Radix_Sort_388">九、基数排序(Radix
id="1_389">
1.算法描述基数排序是一种非比较类的线性时间排序算法,也是桶排序的高效变种。
其核心逻辑并非直接比较元素大小,而是将元素按
拆分(如十进制数的个位、十位、百位),对每一位依次执行稳定排序(通常用计数排序
从最低位到最高位(或反之)完成所有位的排序后,数组会自然整体有序。
该算法完全避开比较操作,突破了比较类排序
id="2_391">
2.核心思想基数排序的前提是:待排序元素可按
2)。
主流的低位优先(LSD)
计数:从最低位(个位)到最高位依次遍历每一位:
src="https://i-blog.csdnimg.cn/direct/4b2be07c4b5748a5ad1daed4d29b4759.gif#pic_center">
function">radixSort
class="token
punctuation">::
vectorclass="token
function">max_element
class="token
punctuation">;
maxDigitclass="token
punctuation">::
vectorclass="token
punctuation">::
vectorclass="token
punctuation">;
bucketsclass="token
punctuation">[
digitclass="token
function">push_back
class="token
punctuation">}
bucketclass="token
punctuation">}
算法分析
k)
id="Bucket_Sort_449">十、桶排序(Bucket
id="1_450">
1.算法描述桶排序是一种基于分治和值域映射的非比较类线性时间排序算法,也是计数排序、基数排序的通用扩展形式。
其核心逻辑是将待排序元素按预设的
中,对每个桶内的元素执行稳定排序(通常用插入排序),最后按桶的顺序合并所有桶内的元素
id="2_452">
2.核心思想桶排序的前提是:待排序元素均匀分布在某个连续值域范围内(如
bucketCount(通常取数组长度的平方根或固定值),计算每个桶的区间大小
bucketCount;
个空桶,遍历原数组,将每个元素根据值域映射到对应的桶中(映射公式:桶索引
interval);
src="https://i-blog.csdnimg.cn/direct/4d980f4bde9a476ca57718511db39b29.gif#pic_center">
function">bucketSort
class="token
punctuation">::
vectorclass="token
function">max_element
class="token
function">min_element
class="token
punctuation">::
vectorclass="token
punctuation">::
vectorclass="token
punctuation">(
bucketCountclass="token
punctuation">;
bucketsclass="token
punctuation">[
indexclass="token
function">push_back
class="token
function">insertionSort
class="token
punctuation">(
bucketclass="token
punctuation">}
O(n*n)所有元素进一个桶)
k)
id="_498">通用准备工作
为了方便测试和展示排序效果,我们先定义两个通用函数:打印数组、生成随机数组。
所有排序算法都会基于这两个函数进行测试。
string"><iostream>
class="token
string"><vector>
class="token
string"><cstdlib>
class="token
string"><ctime>
class="token
string"><cmath>
class="token
string"><algorithm>
class="token
function">printArray
class="token
punctuation">::
vectorclass="token
punctuation">::
endlclass="token
punctuation">::
vectorclass="token
function">generateRandomArray
class="token
punctuation">::
vectorclass="token
punctuation">}
punctuation">::vector function">generateRandomArray function">printArray 测试每种排序算法(每次测试前复制原始数组) punctuation">:: function">bubbleSort punctuation">( function">printArray punctuation">( function">selectionSort punctuation">( function">printArray punctuation">( function">insertionSort punctuation">( function">printArray punctuation">( function">shellSort punctuation">( function">printArray punctuation">( function">mergeSort punctuation">( function">printArray punctuation">( function">quickSort punctuation">( function">printArray punctuation">( punctuation">( function">printArray punctuation">( function">countingSort punctuation">( function">printArray punctuation">( function">radixSort punctuation">( function">printArray punctuation">( function">bucketSort punctuation">( function">printArray punctuation">( punctuation">}class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
id="_592">
总结| 排序算法 | 最好情况 | 最坏情况 | 平均时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
|---|---|---|---|---|---|---|
| 冒泡排序 | O(n) | O(n*n) | O(n*n) | O(1) | 稳定 | 小规模数据、几乎有序的数据 |
| 选择排序 | O(n*n) | O(n*n) | O(n*n) | O(1) | 不稳定 | 小规模数据 |
| 插入排序 | O(n) | O(n*n) | O(n*n) | O(1) | 稳定 | 小规模数据、几乎有序的数据 |
| 希尔排序 | O(n) | O(n*n) | O(n^1.3) | O(1) | 不稳定 | 中等规模数据 |
| 归并排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(n) | 稳定 | 大规模数据、需要稳定排序 |
| 快速排序 | O(n*logn) | O(n*n) | O(n*logn) | O(logn) | 不稳定 | 大规模数据(实际应用最优) |
| 堆排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(1) | 不稳定 | 大规模数据、内存受限场景 |
| 计数排序 | O(n+k) | O(n+k) | O(n+k) | O(n+k) | 稳定 | 整数、值范围小的数据集 |
| 基数排序 | O(d(n+k)) | O(d(n+k)) | O(d(n+k)) | O(n+k) | 稳定 | 整数、字符串、位数固定的元素 |
| 桶排序 | O(n+k) | O(n*n) | O(n+k) | O(n+k) | 稳定 | 元素均匀分布的数据集 |
桶):不依赖比较,时间复杂度更低,但有适用场景限制。
桶)适合需要保留相等元素相对位置的场景(如电商订单按价格排序后保留下单时间)。
冒泡;大规模数据优先用快速排序(实际性能最优);需要稳定排序选归并;整数且范围小选计数排序;元素均匀分布选桶排序。
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback