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

给定C语言代码是冒泡排序还是快速排序?排序算法类型识别疑问

排序算法识别结果

对应代码

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 10

int main() {
  int data[10], no, i, j, n, c;

  printf("\n Enter no of elements :");
  scanf("%d", &no);
  printf("\nEnter the data");
  for (i = 0; i < no; i++) {
    scanf("%d", &data[i]);
  }
  n = MAX;
  do {
    for (i = 0; i < n - 1; i++) {
      if (data[i] > data[i + 1]) {
        data[i] = data[i] + data[i + 1];
        data[i + 1] = data[i] - data[i + 1];
        data[i] = data[i] - data[i + 1];
      }
    }
    n = n - 1;
    for (i = MAX - 1, c = 0; i >= c; i--) {
      if (data[i] < data[i - 1]) {
        data[i] = data[i] + data[i - 1];
        data[i - 1] = data[i] - data[i - 1];
        data[i] = data[i] - data[i - 1];
      }
    }
    c = c + 1;
  } while (n != 0 && c != 0);
  printf("The sorted array is:");
  for (i = 0; i < no; i++) {
    printf("%d	", data[i]);
  }
}

算法类型判定

这段代码属于鸡尾酒排序,也叫双向冒泡排序、搅拌排序,是冒泡排序的优化变种,不属于快速排序。

逻辑说明

  • 普通冒泡排序仅单向从左到右遍历,每轮把当前最大元素交换到未排序区间的末尾,遇到小元素集中在数组尾部的场景时,需要多轮遍历才能把小元素移到头部,效率很低。
  • 鸡尾酒排序采用双向交替遍历的逻辑:
    1. 每轮先从左到右遍历,把当前最大元素移到未排序区间右端
    2. 再反向从右到左遍历,把当前最小元素移到未排序区间左端
    3. 不断缩小未排序区间的左右边界,直到区间为空,排序完成
  • 你贴的代码完全符合上述逻辑:第一个for循环对应从左到右的正向遍历,n自减缩小右边界;第二个for循环对应从右到左的反向遍历,c自增缩小左边界。

注:该代码存在实现缺陷,固定以MAX=10作为遍历边界,当用户输入的元素数量小于10时,未初始化的数组元素会参与排序,导致结果异常,但不影响算法类型的判定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:45:04