go语言:实现奇偶转置排序算法(附带源码)

一、项目背景详细介绍

在排序算法体系中,除了我们熟悉的:

  • 冒泡排序(Bubble Sort)
  • 插入排序(Insertion Sort)
  • 选择排序(Selection Sort)
  • 快速排序(Quick Sort)
  • 归并排序(Merge Sort)

还存在一类专门为并行计算环境设计的排序算法。

其中一个经典算法就是:

奇偶转置排序(Odd-Even Transposition Sort)

它也被称为:

  • Brick Sort
  • Parallel Bubble Sort

该算法特别适用于:

  • 多核CPU并行计算
  • 分布式排序
  • GPU排序
  • MPI并行环境
  • 排序网络教学

在理论上,它属于:

冒泡排序的并行改进版本

虽然时间复杂度仍然是 O(n²),但其阶段结构非常适合并行化。


二、项目需求详细介绍

功能要求

  1. 实现整数数组奇偶转置排序
  2. 支持升序排序
  3. 提供泛型版本(Go 1.18+)
  4. 提供并发优化版本
  5. 代码完整可运行
  6. 所有代码放在一个代码块内
  7. 包含详细注释
  8. 提供完整测试代码

三、相关技术详细介绍

1️⃣ 什么是奇偶转置排序?

奇偶转置排序的核心思想:

在 n 轮迭代中,交替执行“奇数索引比较”和“偶数索引比较”。

算法步骤:

  • 第 0 轮:比较 (0,1), (2,3), (4,5)...
  • 第 1 轮:比较 (1,2), (3,4), (5,6)...
  • 第 2 轮:比较 (0,1), (2,3), (4,5)...
  • ...
  • 总共执行 n 轮

关键点:

  • 每轮的比较可以并行执行
  • 一共需要 n 轮
  • 保证排序完成

2️⃣ 与普通奇偶排序区别

对比项奇偶排序奇偶转置排序
终止条件无交换即停止固定执行 n 轮
轮次数量不确定固定 n 轮
更适合并行更适合
算法结构while循环for固定轮次

3️⃣ 算法示例

假设数组:

[5, 3, 8, 4, 2]

第一轮(偶数阶段):
(0,1), (2,3)

第二轮(奇数阶段):
(1,2), (3,4)

不断执行共 n 轮。


4️⃣ 时间复杂度

  • 最坏:O(n²)
  • 平均:O(n²)
  • 空间复杂度:O(1)

四、实现思路详细介绍

核心思路

设数组长度为 n:

for i := 0; i < n; i++ {
if i%2 == 0:
执行偶数阶段
else:
执行奇数阶段
}

偶数阶段:

for j := 0; j < n-1; j += 2

奇数阶段:

for j := 1; j < n-1; j += 2


五、完整实现代码

// ========================================== // 文件名:main.go // ========================================== package main import ( "fmt" "sync" ) // ========================================== // 基础奇偶转置排序(整数版本) // ========================================== // OddEvenTranspositionSort 实现奇偶转置排序 func OddEvenTranspositionSort(arr []int) { n := len(arr) // 固定执行 n 轮 for phase := 0; phase < n; phase++ { // 偶数阶段 if phase%2 == 0 { for i := 0; i < n-1; i += 2 { if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } } } else { // 奇数阶段 for i := 1; i < n-1; i += 2 { if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } } } } } // ========================================== // 泛型版本(Go 1.18+) // ========================================== type Ordered interface { ~int | ~int64 | ~float64 | ~string } // OddEvenTranspositionSortGeneric 泛型实现 func OddEvenTranspositionSortGeneric[T Ordered](arr []T) { n := len(arr) for phase := 0; phase < n; phase++ { if phase%2 == 0 { for i := 0; i < n-1; i += 2 { if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } } } else { for i := 1; i < n-1; i += 2 { if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } } } } } // ========================================== // 并发版本(教学演示) // ========================================== // OddEvenTranspositionSortParallel 并发实现 func OddEvenTranspositionSortParallel(arr []int) { n := len(arr) for phase := 0; phase < n; phase++ { var wg sync.WaitGroup if phase%2 == 0 { for i := 0; i < n-1; i += 2 { wg.Add(1) go func(i int) { defer wg.Done() if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } }(i) } } else { for i := 1; i < n-1; i += 2 { wg.Add(1) go func(i int) { defer wg.Done() if arr[i] > arr[i+1] { arr[i], arr[i+1] = arr[i+1], arr[i] } }(i) } } wg.Wait() } } // ========================================== // 测试代码 // ========================================== func main() { // 基础测试 arr := []int{5, 3, 8, 4, 2, 7, 1} fmt.Println("排序前:", arr) OddEvenTranspositionSort(arr) fmt.Println("排序后:", arr) // 泛型测试 strArr := []string{"banana", "apple", "orange", "grape"} fmt.Println("\n字符串排序前:", strArr) OddEvenTranspositionSortGeneric(strArr) fmt.Println("字符串排序后:", strArr) // 并发版本测试 arr2 := []int{9, 4, 6, 2, 8, 1} fmt.Println("\n并发排序前:", arr2) OddEvenTranspositionSortParallel(arr2) fmt.Println("并发排序后:", arr2) }

六、代码详细解读(仅解读方法作用)

OddEvenTranspositionSort

  • 固定执行 n 轮
  • 每轮根据 phase 判断奇偶阶段
  • 比较相邻元素并交换

OddEvenTranspositionSortGeneric

  • 使用 Go 泛型
  • 支持 int、float、string
  • 提高复用性

OddEvenTranspositionSortParallel

  • 每对比较使用 goroutine
  • 使用 WaitGroup 同步
  • 教学展示并行排序思想

⚠️ 注意:

该版本可能存在数据竞争问题,在生产环境需加锁或使用原子操作。


七、项目详细总结

本项目实现了:

  • 奇偶转置排序原理
  • 基础版本
  • 泛型版本
  • 并发版本
  • 教学级代码结构

优点:

  • 实现简单
  • 易理解
  • 适合并行
  • 排序网络经典算法

缺点:

  • 时间复杂度高
  • 不适合大规模数据

八、项目常见问题及解答

Q1:与奇偶排序一样吗?

逻辑相似,但奇偶转置排序固定执行 n 轮。


Q2:是否稳定排序?

是稳定排序。


Q3:为什么适合并行?

同一阶段的比较对互不影响。


Q4:时间复杂度是多少?

O(n²)


Q5:生产环境使用吗?

一般不用于大数据排序。


九、扩展方向与性能优化

1️⃣ 使用 atomic 修复并发竞争


2️⃣ 实现排序网络可视化


3️⃣ GPU版本实现


4️⃣ MPI分布式版本


5️⃣ 与快速排序混合实现


结语

通过本篇文章,你掌握了:

  • 奇偶转置排序原理
  • 并行排序思想
  • Go泛型排序实现
  • 固定轮次排序结构

奇偶转置排序是:

并行排序网络的经典算法

理解它,就真正理解了:

  • 并行排序的阶段模型
  • 相邻交换排序机制
  • 排序网络基础结构

这是深入学习并行计算与高性能算法的重要一步。

Read more

Linux初探:从零开始的命令行冒险

Linux初探:从零开始的命令行冒险

🔥 码途CQ:个人主页 ✨ 个人专栏:《Linux》 | 《经典算法题集》《C++》《QT》 ✨ 追风赶月莫停留,无芜尽处是春山! 💖 欢迎关注,一起交流学习 💖 📌 关注后可第一时间获取C++/Qt/算法干货更新 🌟 🐧 第一章:欢迎来到Linux的世界 一、Linux:不只是企鹅,更是程序员的乐园 大家好!今天我们来聊聊 Linux —— 这个让无数程序员又爱又恨的操作系统。你是否曾对那个黑色的命令行窗口感到恐惧?是否觉得输入一行行指令像是和机器对话?别担心,今天我们就一起推开Linux的大门,从零开始,轻松上手! 二、Linux的前世今生:一个芬兰学生的“业余项目” Linux的故事充满了传奇色彩。1991年,赫尔辛基大学的一名研究生Linus Torvalds在自己的电脑上写了一个小小的操作系统内核。当时他可能没想到,这个“业余爱好”会成长为如今影响世界的开源操作系统。 有趣的是,Linus最初只是在Minix(一个教学用操作系统)的基础上进行改进,后来他决定:“嘿,我要写一个比Minix更好的系统!”于是Linux诞生了。

By Ne0inhk
Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_cache_drift_store 的鸿蒙化适配指南 - 实现基于 Drift 的高性能 HTTP 缓存控制、支持本地持久化网络内容与端侧弱网访问体验优化 前言 在进行 Flutter for OpenHarmony 开发时,网络请求的响应速度和在离线状态下的可用性直接决定了应用的品质。虽然内存缓存能解决部分问题,但退出应用即消失。http_cache_drift_store 是一款强大的持久化缓存库,它利用 Drift(原 moor)这一高性能 SQL 引擎作为存储底座,为 HTTP 请求提供了坚固的“本地镜像”。本文将探讨如何在鸿蒙端构建极致的网络数据缓存层。 一、原原理性解析 / 概念介绍 1.1

By Ne0inhk
Flutter 组件 serverpod_swagger 的适配 鸿蒙Harmony 实战 - 驾驭 API 文档自动化、实现鸿蒙端全栈联调与 Swagger UI 动态审计方案

Flutter 组件 serverpod_swagger 的适配 鸿蒙Harmony 实战 - 驾驭 API 文档自动化、实现鸿蒙端全栈联调与 Swagger UI 动态审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 serverpod_swagger 的适配 鸿蒙Harmony 实战 - 驾驭 API 文档自动化、实现鸿蒙端全栈联调与 Swagger UI 动态审计方案 前言 在鸿蒙(OpenHarmony)的大型项目研发中,前端(鸿蒙应用)与后端(Dart Server)的沟通效率,往往直接决定了产品的上线节奏。传统的“手动维护 API 文档”模式,不仅耗时耗力,更由于文档与代码的脱节,导致了大量“因为 API 字段改动而引发的 Crash”。 我们需要一种“代码即文档”的高阶自动化生产力。 serverpod_swagger 是 Serverpod

By Ne0inhk