上篇:《排序算法的奇妙世界:如何让数据井然有序?》

上篇:《排序算法的奇妙世界:如何让数据井然有序?》

个人主页:strive-debug

排序算法精讲:从理论到实践

 一、排序概念及应用


 1.1 基本概念  


**排序**:将一组记录按照特定关键字(如数值大小)进行递增或递减排列的操作。
 1.2 常见排序算法分类

 
- **简单低效型**:直接插入排序、冒泡排序、选择排序  
- **高效优化型**:希尔排序、快速排序、归并排序、堆排序  

---

二、基础排序算法实现
 2.1 插入排序家族
 2.1.1 直接插入排序


核心思想:将待排元素逐个插入已有序序列中。  
void InsertSort(int* arr, int n) { for (int i = 0; i < n - 1; i++) { int end = i; int tmp = arr[end + 1]; while (end >= 0) { if (arr[end] > tmp) { arr[end + 1] = arr[end]; end--; } else { break; } } arr[end+1] = tmp; } }

我的理解(如图所示):

**特性分析**:  
 **接近有序时效率高**  
 时间复杂度:O(N^2)
 空间复杂度:O(1)
 2.1.2 希尔排序(优化版插入排序)


**优化策略**:通过分组增量(gap)预排序逐步逼近全局有序。  
void ShellSort(int* arr, int n) { int gap = n; while (gap > 1) { //推荐写法:除3 gap = gap / 3 + 1; for (int i = 0; i < n - gap; i++) { int end = i; int tmp = arr[end + gap]; while (end >= 0) { if(arr[end] > tmp) { arr[end + gap] = arr[end]; end -= gap; } else { break; } } arr[end + gap] = tmp; } } }

我的理解(如图所示):

 

**特性分析**:  
 **突破O(N^2)的时间瓶颈**  
 时间复杂度:约 O(N^{1.3}) 
 空间复杂度:O(1)

---

2.2 选择排序


直接选择排序
**核心思想**:每轮选取最小/最大值固定到序列两端。  

void SelectSort(int* arr, int n) { int begin = 0, end = n - 1; while (begin < end) { int maxi = begin; int mini = begin; for (int i = begin; i <= end; i++)//end=n-1,不是n { if (arr[i] > arr[maxi]) { maxi = i;//不是arr[i] } if (arr[i] < arr[mini]) { mini = i; } } //要先判断如果maxi在开头的话,就是发生来回替换的情况 if (maxi == begin) { maxi = mini; } //循序不能乱 Swap(&arr[mini], &arr[begin]); Swap(&arr[maxi], &arr[end]); //不要忘记让end和begin,这是一个while循环 end--; begin++; } }

我的理解(如图所示):

---

 2.3 交换排序


冒泡排序
经典实现+提前终止优化:  
 

void BubbleSort(int* arr, int n) { int exchange = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { exchange = 1; Swap(&arr[j], &arr[j + 1]); } } if (exchange == 0) { break; } } }
**适用场景**:  
 **教学演示为主,实际工程较少使用**  
 时间复杂度:O(N^2)  

---

三、算法对比总结

| 算法         | 时间复杂度       | 空间复杂度 | 稳定性 | 适用场景             |
|--------------|------------------|------------|--------|------------------------|
| 直接插入排序 |O(N^2)      | O(1)   | ✔️      | 小规模或接近有序数据   |
| 希尔排序        |O(N^{1.3}) |O(1)    | ✖️      | 中等规模数据                 |
| 选择排序        |O(N^2)      | O(1)   | ✖️      | 教学演示                         |
| 冒泡排序        |O(N^2)      | O(1)   | ✔️      | 理解交换思想                 |

---

 **四、下篇预告**
**《高阶排序算法:分治思想与性能突破》**  
-  **快速排序的三种分区策略**  
-  **归并排序的递归与非递归实现**  
-  **堆排序与优先队列的深度关联**

---

Read more

Flutter 组件 unpub 的适配 鸿蒙Harmony 实战 - 驾驭私有 Dart 包资产中枢、实现鸿蒙端企业级代码版本治理与安全审计方案

Flutter 组件 unpub 的适配 鸿蒙Harmony 实战 - 驾驭私有 Dart 包资产中枢、实现鸿蒙端企业级代码版本治理与安全审计方案

欢迎加入开源鸿蒙跨平台社区:[https://openharmonycrossplatform.ZEEKLOG.net](https://openharmonycrossplatform.ZEEKLOG. net) Flutter 组件 unpub 的适配 鸿蒙Harmony 实战 - 驾驭私有 Dart 包资产中枢、实现鸿蒙端企业级代码版本治理与安全审计方案 前言 在鸿蒙(OpenHarmony)生态的大规模企业级应用矩阵、涉及敏感核心业务逻辑的政务信息底座以及需要实现“完全内网闭环”的各种专业化协作项目开发中,“Dart 包资产的安全可控与高效分发”是确保项目可持续演进的工业生命线。面对包含数百个已模块化的 0307 批次私有库。如果仅仅依靠 Git 依赖或公网 Pub 进行管理。不仅会导致在内网弱网环境下产生频繁的编译失败,更会因为缺乏一套中心化的“版本快照指纹”与“访问权限门禁”。引发严重的代码逻辑逻辑外泄与由于包冲突引发的项目崩溃风险。 我们需要一种“资产私有、分发可审计”的治理艺术。 unpub 是一套专注于构建轻量级、

By Ne0inhk
【Linux】线程同步与互斥

【Linux】线程同步与互斥

一. 线程互斥 引入 要理解线程互斥的概念,首先我们要先从,为什么线程需要互斥这个点切入。 我们先来看看下面这串代码,这是一段有关抢票的代码 运行结果: 我们让三个线程同时进行抢票,发现票数被抢到了负数,这样的结果当然不符合我们的预期。 票数抢到负数是因为线程产生了竞态关系,当一个线程达到 0 时,另一个线程可能刚好执行了 - - 的代码,此时当前的线程在进行 - - 就出现了负数。 当多个线程访问共享资源时,如果不考虑线程安全问题,可能会导致数据丢失,错误等原因。 1. 进程互斥基本概念与背景 (1)互斥与并发 互斥就是相互排斥,有你没我,与互斥相对的一组是并发,并发就是可以同时存在。 我们将这组概念带入线程中,互斥就是在同一时间,只能有一个线程对共享资源进行访问;线程并发就是在同一时间,线程同时竞争共享资源。 (2)同步与异步 同步与异步是相对的,同步必须等待被调用方执行完毕并返回结果才能继续执行后续操作,相当于线程被阻塞住了。异步就是多个线程自己执行自己的内容,不需要关心其他的线程。 (3)操作原子性

By Ne0inhk
Flutter 组件 metalink 的适配 鸿蒙Harmony 实战 - 驾驭元链接资源分发协议、实现鸿蒙端多源并行下载与资产完整性分片审计方案

Flutter 组件 metalink 的适配 鸿蒙Harmony 实战 - 驾驭元链接资源分发协议、实现鸿蒙端多源并行下载与资产完整性分片审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 metalink 的适配 鸿蒙Harmony 实战 - 驾驭元链接资源分发协议、实现鸿蒙端多源并行下载与资产完整性分片审计方案 前言 在鸿蒙(OpenHarmony)生态的大规模元服务分发、地图包增量更新以及 IoT 固件包批量下发场景中,“资源获取的绝对可靠性”是系统鲁棒性的生命线。面对从 5 个不同的 CDN 节点同步一个 500MB 的资源包。如果仅仅依靠单线程的 http.get。那么不仅会导致在弱网环境(如鸿蒙车载进入无信号区)下的下载极易中断。更会因为缺乏对文件分片(Segment)的独立哈希校验。引发严重的资产损坏事故。 我们需要一种“多源并行、逻辑闭环”的元链接分发艺术。 metalink 是一套专注于 .metalink (XML) 解析与资源元数据管理的协议套件。它通过定义文件的多个镜像源(

By Ne0inhk
Flutter for OpenHarmony:faker 逼真的模拟数据生成器(测试、原型开发必备) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:faker 逼真的模拟数据生成器(测试、原型开发必备) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在应用开发的早期,或者在编写 UI 测试时,我们经常面临“没有数据”的尴尬。 * 后端接口还没开发好。 * 由于隐私合规,不能使用真实的线上用户数据进行测试。 * 需要大量的列表数据来测试滑动的流畅性。 手写 test1, test2 这种数据既枯燥又无法还原真实场景的 UI 布局问题(比如名字太长换行)。 faker 是一个专门用于生成伪造数据的库。它能生成逼真的人名、地址、电话、公司名、日期、 lorem ipsum 文本等。 对于 OpenHarmony 开发者,在鸿蒙真机上进行 UI 适配和性能测试时,一键生成 1000 条逼真的测试数据,能极大提升开发效率。 一、核心功能 faker 提供了分类丰富的数据生成器: 1. Person:

By Ne0inhk