You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我自研的这款冒泡排序变体是否已有对应名称?

你的算法是地精排序(Gnome Sort)的变体

你的排序算法本质上是**地精排序(Gnome Sort)**的一种实现变体,核心逻辑和地精排序完全一致:当扫描时发现逆序元素对,就将较小的元素逐步向前交换,直到它处于正确的排序位置,之后再继续向后扫描数组。

核心逻辑说明

地精排序的设计思路模拟了地精整理花园的过程:从左到右遍历,遇到位置不对的元素就将其“插”到前面正确的位置,再继续后续扫描。你的代码完美契合这个逻辑:

  • 正向遍历数组,检查相邻元素的顺序;
  • 发现逆序后立即交换,随后反向扫描将该元素调整到合适位置;
  • 完成局部调整后,回到原扫描位置继续向后处理。

和鸡尾酒排序的区别

你提到的鸡尾酒排序(Cocktail Shaker Sort)是双向全量扫描:先正向遍历把最大元素冒泡到末尾,再反向遍历把最小元素冒泡到开头,反复来回直到数组有序。而你的算法是单次正向扫描中的局部反向调整,不需要完整遍历整个数组的反向过程,两者的执行逻辑和效率特性有明显差异。

你的算法示例与代码

排序过程示例(输入数组 [1 4 2 0 8])

  1. [1 4] 已排序,无需交换。
  2. [4 2] 未排序,交换为 [2 4],开始反向扫描。
  3. [1 2] 已排序,继续正向扫描。
  4. [4 0] 未排序,交换为 [0 4],开始反向扫描。
  5. [2 0] 未排序,交换为 [0 2]。
  6. [1 0] 未排序,交换为 [0 1],到达数组起始位置,继续正向扫描。
  7. [4 8] 已排序,无需交换。
  8. 到达数组末尾。

排序过程的数组变化:

1 4 2 0 8
1 4 2 0 8
1 2 4 0 8
1 2 0 4 8
1 0 2 4 8
0 1 2 4 8

实现代码

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void sort(int *arr, size_t n) {
    for (size_t i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i+1]) {
            swap(&arr[i], &arr[i+1]);
            
            for (size_t j = i; j > 0 && arr[j-1] > arr[j]; j--) {
                swap(&arr[j-1], &arr[j]);
            }           
        }
    }
}

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:54:26