当前位置: 首页 > news >正文

C语言--简单排序算法(冒泡、选择、插入)

实现三种简单的排序算法

文章目录

  • 冒泡排序
    • 改进
    • 改进2
  • 选择排序
  • 插入排序
  • 执行结果

冒泡排序

每次外层循环,排出一个最大值

void bubbleSort(int arr[], int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

改进

  1. 设置排序完成标志,如果排序完成跳出循环
  2. 通过设置边界,跳过无意义的片段
void bubbleSort2(int arr[], int len) {
    int border = len - 1;
    for (int i = 0; i < len; i++) {
        bool isSorted = true;
        int lastSwap = 0;
        for (int j = 0; j < border; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                isSorted = false;
                lastSwap = j;
            }
        }
        border = lastSwap;
        if (isSorted) {
            break;
        }
    }
}

改进2

双向冒泡排序,又称鸡尾酒排序

void bubbleSort3(int arr[], int len) {
    for (int i = 0; i < len / 2; i++) {
        //有序标记,每一轮的初始值都是true
        bool isSorted = true;

        //奇数轮,从左向右比较和交换
        for (int j = i; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int t1 = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t1;
                isSorted = false;
            }
        }
        if (isSorted) {
            break;
        }

        //在偶数轮之前,将isSorted重新标记为true
        isSorted = true;
        for (int j = len - i - 1; j > i; j--) {
            if (arr[j] < arr[j - 1]) {
                int t2 = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = t2;
                isSorted = false;
            }
        }
        if (isSorted) {
            break;
        }
    }
}

动态记录有效边界

void bubbleSort4(int arr[], int len) {
    int left = 0;
    int right = len - 1;
    int lastSwap = 0;
    while (left < right) {
         // 奇数轮
        lastSwap = left;
        for (int i = left; i < right; i++) {
            if (arr[i] > arr[i+1]) {
                int t1 = arr[i];
                arr[i] = arr[i+ 1];
                arr[i+ 1] = t1;
                lastSwap = i;
            }
        }
        // 收缩右边界
        right = lastSwap;
        
        // 偶数轮
        lastSwap = right;
        for (int i = right; i > left; i--) {
             if (arr[i] < arr[i - 1]) {
                 int t2 = arr[i];
                 arr[i] = arr[i - 1];
                 arr[i - 1] = t2;
                 lastSwap = i;
             }
        }
        // 收缩左边界
        left = lastSwap;
    }
}

选择排序

每次循环选出一个最小值,放在数组最前面

  void selectionSort(int arr[], int len) {
    for (int i = 0; i < len; i++) {
        int minIndex = i;
        for (int j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

插入排序

每次将一个数加入到已经排好序的数列当中
第一个数是直接排好的

void insertionSort(int arr[], int len) {
    for (int i = 1; i < len; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
   }
}

执行结果

int main() {
    //定义数组元素
    int array[] = {12, 3, 77, 34, 91, 23, 19, 1,45, 37};
    int len = sizeof(array) / sizeof(array[0]);
    insertionSort(array, len);
    //输出
    for (int i = 0; i < len; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    return 0;
}

![在

相关文章:

  • 迷你世界脚本出生点接口:Spawnport
  • 论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition
  • java在mavenclean之后点击主启动函数,一直显示java找不到符号的解决办法
  • oracle常用参数解析
  • 数据结构篇—栈(stack)
  • 蓝陵科技:以“数字底座”之力,全面布局影视行业工业化
  • 【赵渝强老师】监控Redis
  • Redis100道高频面试题
  • 初阶数据结构习题【7】(3顺序表和链表)—— 21. 合并两个有序链表
  • 浅谈汽车系统电压优缺点分析
  • 2.Deepseek提示语技巧到多场景应用
  • 《AI大模型技术应知应会100篇》No1. 大模型文件格式一篇读懂读全
  • linux网络(3)—— socket编程(1)socket基础认识
  • 一篇文了解 Go的 init 函数---目的、执行和最佳实践
  • 【大模型学习】第三章 Prompt工程技术要点详解:从原理到应用
  • 如何实现在Windows系统内搭建Linux系统(WSL)
  • FPGA学习篇——Verilog学习3
  • 记录遇到的面试题
  • 云服务器漏洞 ALINUX3-SA-2024:0050: container-tools:rhel8 安全和BUG修复更新
  • Jmeter日志打印
  • 公司简介网站怎么做/站长工具的使用seo综合查询排名
  • 常设中国建设工程法律论坛网站/广告服务平台
  • 新疆网站建设一条龙服务/免费发布信息的网站平台
  • 网站技术维护/网络营销渠道
  • 黄江做网站/教育培训网站官网
  • 网站建设公司兴田德润i简介/阿里云域名查询