优化之前的排序代码

34 阅读2分钟

旧代码:

#include <stdio.h>
int main() {
    // 定义存储5个数字的数组
    int arr[5];

    // 从键盘输入5个数字
    for(int i=0; i<5; i++){
        scanf("%d", &arr[i]);
    }

    // 冒泡排序(从小到大)
    for(int i=0; i<4; i++){  // 共进行4轮排序(5个元素只需排4轮)
        // 每轮将当前最大的元素“冒泡”到末尾,内层循环次数逐轮减少
        for(int j=0; j<4-i; j++){  
            if(arr[j] > arr[j+1]){  // 若前一个元素大于后一个,交换位置
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }

    // 打印排序后的结果
    printf("排序后的结果:");
    for(int i=0; i<5; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}

旧代码缺点:

  1. 核心缺点:排序效率极低,存在大量无效循环
  2. 输出格式不规范
  3. 鲁棒性差,适配场景单一(仅能处理 “完全无序” 的数组,面对 “接近有序”“完全有序” 的常见场景时,无法自适应优化)

优化代码:

#include <stdio.h>

int main() {
    int arr[5];
    int i, j, temp;
    int isSwitch; // 标记是否发生交换,优化冒泡排序

    // 输入5个数字
    for (i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
    }

    // 冒泡排序(修改为升序:从小到大)
    for (i = 0; i < 4; i++) {
        isSwitch = 0; // 初始化为未交换
        for (j = 0; j < 4 - i; j++) {
            // 核心修改:前数大于后数则交换 → 实现升序
            if (arr[j] > arr[j + 1]) { 
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                isSwitch = 1; // 标记发生了交换
            }
        }
        if (isSwitch == 0) { // 本轮无交换,说明已有序,提前退出
            break;
        }
    }

    // 输出排序结果
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n"); // 换行优化输出格式

    return 0;
}

新代码优点:

  1. 核心优势:排序效率大幅提升(最关键)
  2. 输出格式更友好、规范
  3. 鲁棒性更强,适配更多场景