给定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]); } }
算法类型判定
这段代码属于鸡尾酒排序,也叫双向冒泡排序、搅拌排序,是冒泡排序的优化变种,不属于快速排序。
逻辑说明
- 普通冒泡排序仅单向从左到右遍历,每轮把当前最大元素交换到未排序区间的末尾,遇到小元素集中在数组尾部的场景时,需要多轮遍历才能把小元素移到头部,效率很低。
- 鸡尾酒排序采用双向交替遍历的逻辑:
- 每轮先从左到右遍历,把当前最大元素移到未排序区间右端
- 再反向从右到左遍历,把当前最小元素移到未排序区间左端
- 不断缩小未排序区间的左右边界,直到区间为空,排序完成
- 你贴的代码完全符合上述逻辑:第一个for循环对应从左到右的正向遍历,n自减缩小右边界;第二个for循环对应从右到左的反向遍历,c自增缩小左边界。
注:该代码存在实现缺陷,固定以MAX=10作为遍历边界,当用户输入的元素数量小于10时,未初始化的数组元素会参与排序,导致结果异常,但不影响算法类型的判定。
内容的提问来源于stack exchange,提问作者Its Lee
相关产品推荐
相关产品推荐

