我自研的这款冒泡排序变体是否已有对应名称?
你的算法是地精排序(Gnome Sort)的变体
你的排序算法本质上是**地精排序(Gnome Sort)**的一种实现变体,核心逻辑和地精排序完全一致:当扫描时发现逆序元素对,就将较小的元素逐步向前交换,直到它处于正确的排序位置,之后再继续向后扫描数组。
核心逻辑说明
地精排序的设计思路模拟了地精整理花园的过程:从左到右遍历,遇到位置不对的元素就将其“插”到前面正确的位置,再继续后续扫描。你的代码完美契合这个逻辑:
- 正向遍历数组,检查相邻元素的顺序;
- 发现逆序后立即交换,随后反向扫描将该元素调整到合适位置;
- 完成局部调整后,回到原扫描位置继续向后处理。
和鸡尾酒排序的区别
你提到的鸡尾酒排序(Cocktail Shaker Sort)是双向全量扫描:先正向遍历把最大元素冒泡到末尾,再反向遍历把最小元素冒泡到开头,反复来回直到数组有序。而你的算法是单次正向扫描中的局部反向调整,不需要完整遍历整个数组的反向过程,两者的执行逻辑和效率特性有明显差异。
你的算法示例与代码
排序过程示例(输入数组 [1 4 2 0 8])
[1 4]已排序,无需交换。[4 2]未排序,交换为[2 4],开始反向扫描。[1 2]已排序,继续正向扫描。[4 0]未排序,交换为[0 4],开始反向扫描。[2 0]未排序,交换为[0 2]。[1 0]未排序,交换为[0 1],到达数组起始位置,继续正向扫描。[4 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
相关产品推荐
相关产品推荐

