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

C语言程序设计十大排序—冒泡排序

文章目录

  • 1.概念✅
  • 2.冒泡排序🎈
  • 3.代码实现✅
    • 3.1 直接写✨
    • 3.2 函数✨
  • 4.总结✅

1.概念✅

  排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展的历程中,在排序算法的研究一直深受人们重视,出现了很多算法,在思路、效率、应用等方面各有特色。通过学习排序算法,读者可以理解不同算法的优势和局限性,并根据具体情况选择最合适的算法,以提高程序的性能和效率。学习排序算法还有助于培养逻辑思维和问题解决能力,在解决其他类型的问题时也能够应用到类似的思维方法。

2.冒泡排序🎈

 冒泡排序(Bubble Sort)也是一种简单、直观的排序算法,它的算法思想和选择排序差不多,略有区别。
 第一轮,找到最大的数,放到第n个位置:
 第二轮,找到第2大的数,放到第n-1个位置;
 ......
 第n轮,找到最小的数,放到第1个位置。
 与选择排序的原理过于简单相比,冒泡排序用到了“冒泡”这个小技巧。以“第一轮,找最大的数,放到第n个位置”为例,对a[0]~a[n-1]做冒泡排序,操作如下:
 (1)从第1个数a[0]开始,比较a[0]和a[1],如果a[0]>a[1],交换。进一步把前面两个数的最大数放到了第2个位置,如下图所示。

排序前
 (2)比较a[1]和a[2],如果a[1]>a[2],交换,这一步把前面3个数的最大数放到了第3个位置,如下图所示:
排序后
 (3)比较a[2]和a[3]…
  依次比较相邻的两个数,直到最后两个数a[n-2]和a[n-1],就把最大的数放到了第a[n-1]个位置。一共比较了n-1次。
  将这个过程形象地比喻为“冒泡”,最大的元素像气泡一样慢慢“浮”到了顶端。
  以上是“第一轮,最大元素的冒泡”,其他的数也同样的方法处理,一共做n-1轮冒泡。第i轮找到第i大的数,冒泡到a[i-1],就把第i大的数放到了第i个位置。

3.代码实现✅

3.1 直接写✨

#include <stdio.h>

int main() {
    int arr[] = {13, 14, 52, 12, 22, 11, 90}; // 原始数组
    int n = sizeof(arr) / sizeof(arr[0]); // 数组大小
    int temp,i,j;
    printf("排序前:");
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

            }
        }
    }
    printf("排序后:");
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
}

3.2 函数✨

#include <stdio.h>

void bubbleSort(int arr[], int n) {
    int temp,i,j;
    for (i = 0; i < n - 1; i++) {
        // 设置一个标志位,用于优化
        int swapped = 0;
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                // 标记有元素交换
                swapped = 1;
            }
        }
        // 如果没有发生交换,数组已经排好序
        if (swapped == 0) {
            break;
        }
    }
}

void printArray(int arr[], int n) {
	int i;
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {13, 14, 52, 12, 22, 11, 90}; // 原始数组
    int n = sizeof(arr) / sizeof(arr[0]); // 数组大小
    bubbleSort( arr, n);
    printArray( arr, n);
}

4.总结✅

  冒泡排序的计算复杂度:第5行和第8行有两重for循环计算复杂度为O(n^2),和选择排序的计算复杂度一样。
  冒泡排序可以做一点优化:若两个相邻的数已经有序,那么不用冒泡;在第i轮求第i大的数时,若一次冒泡都没有发生,说明整个数列已经有序,算法结束。

Perspective-takling


http://www.kler.cn/a/514353.html

相关文章:

  • linux-FTP服务配置与应用
  • Golang Gin系列-5:数据模型和数据库
  • 电脑如何访问手机文件?
  • 【物联网】keil仿真环境设置 keilV5可以适用ARM7
  • 【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
  • Java - WebSocket
  • vim文本编辑器
  • Leetcode:2239
  • 卸载和安装Git小乌龟、git基本命令
  • npm install 报错:Command failed: git checkout 2.2.0-c
  • 自然语言处理(NLP)领域相关模型概述
  • MOS怎样选型,步骤详解
  • 20250119面试鸭特训营第27天
  • python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖
  • Python----Python高级(正则表达式:语法规则,re库)
  • 到华为考场考HCIE的注意事项和考试流程
  • [Qt] QPainter | Qpen | QPixmap
  • 计算机视觉算法实战——人类情感识别(主页有源码)
  • 2025年大模型气象预测架构与商业化影响
  • 【记录】Jenkins版本及JDK关系介绍的官网地址
  • 优选算法《二分查找》
  • ue5 在一个蒙太奇的上半身插槽放两段动画,用片段1,2作为区分。播放动画蒙太奇,自由选择片段1,2
  • C# 通用缓存类开发:开启高效编程之门
  • 微服务知识——4大主流微服务架构方案
  • Django学习笔记(项目默认文件)-02
  • 【mptcp】ubuntu18.04和MT7981搭建mptcp测试环境操作说明