網(wǎng)站首頁 編程語言 正文
一、算法描述
比較相鄰兩個元素,如果第一個比第二個大則交換兩個值。遍歷所有的元素,每一次都會將未排序序列中最大的元素放在后面。假設(shè)數(shù)組有 n 個元素,那么需要遍歷 n - 1 次,因?yàn)槭O碌囊粋€元素一定是最小的,無需再遍歷一次。因此需要兩層循環(huán),第一層是遍歷次數(shù),第二層是遍歷未排序數(shù)組。
動圖如下:
黃色部分表示已排好序的數(shù)組,藍(lán)色部分表示未排序數(shù)組
核心代碼如下:
/** * @brief 冒泡排序 * * @param arr 待排序的數(shù)組 * @param size 數(shù)組大小 */ static void bubble_sort(int *arr, int size) { for (int i = 0; i < size - 1; i++) { bool swapped = false; // 設(shè)置標(biāo)記,用于檢查是否已排好序 for (int j = 0; j < size - i; j++) if (arr[j] > arr[j + 1]) { swap(arr + j, arr + j + 1); swapped = true; } if (!swapped) // 未交換則排序完畢,跳出循環(huán) break; } }
布爾值 swapped 是一種優(yōu)化手段,在每次遍歷未排序數(shù)組之前將其設(shè)置為 false 表示還未交換。如果遍歷完未排序數(shù)組之后其值還是 false 則表示遍歷過程種沒有發(fā)生交換,也就是說數(shù)組已經(jīng)有序,無需再次遍歷,跳出循環(huán)。
二、算法分析
時間復(fù)雜度:O(N2),兩層循環(huán)
空間復(fù)雜度:O(1),交換元素時只用了一個臨時變量
最好情況:O(N),有序數(shù)組遍歷一次后 swapped 為 false 退出循環(huán)
最壞情況:O(N2),數(shù)組倒序
穩(wěn)定性:穩(wěn)定,比較兩個元素大小時不包括元素相等的情況,故相等元素的相對位置不變
三、完整代碼
/** * @file bubble_sort.c * @date 2022-01-16 * @author Pineapple (pineapple_cpp@163.com) * * @brief 冒泡排序 */ #include <assert.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <time.h> /** * @brief 交換函數(shù) * * @param left 左邊的元素 * @param right 右邊的元素 */ static inline void swap(int *left, int *right) { int temp = *left; *left = *right; *right = temp; } /** * @brief 冒泡排序 * * @param arr 待排序的數(shù)組 * @param size 數(shù)組大小 */ static void bubble_sort(int *arr, int size) { for (int i = 0; i < size - 1; i++) { bool swapped = false; // 設(shè)置標(biāo)記,用于檢查是否已排好序 for (int j = 0; j < size - i; j++) if (arr[j] > arr[j + 1]) { swap(arr + j, arr + j + 1); swapped = true; } if (!swapped) // 未交換則排序完畢,跳出循環(huán) break; } } /** * @brief 測試函數(shù) * */ static void test() { const int size = rand() % 500; // 生成隨機(jī)數(shù)組大小 int *arr = (int *)calloc(size, sizeof(int)); // 生成范圍 -50 到 49 的隨機(jī)數(shù)組 for (int i = 0; i < size; i++) arr[i] = rand() % 100 - 50; bubble_sort(arr, size); for (int i = 0; i < size - 1; i++) assert(arr[i] <= arr[i + 1]); free(arr); } int main(void) { srand(time(NULL)); test(); return 0; }
總結(jié)
原文鏈接:https://blog.csdn.net/pineapple_C/article/details/122524148
相關(guān)推薦
- 2022-07-30 .NetCore使用過濾器實(shí)現(xiàn)登錄權(quán)限認(rèn)證的方法小結(jié)_實(shí)用技巧
- 2022-06-12 Linux中rm命令使用以及C/C++代碼實(shí)現(xiàn)_C 語言
- 2022-07-27 flask實(shí)現(xiàn)python方法轉(zhuǎn)換服務(wù)的方法_python
- 2023-01-18 Go語言讀取YAML?配置文件的兩種方式分享_Golang
- 2022-06-06 Python實(shí)現(xiàn)為PDF去除水印的示例代碼_python
- 2022-06-16 linux系統(tǒng)安裝hadoop真分布式集群詳解_云計(jì)算技術(shù)
- 2023-01-23 C語言實(shí)現(xiàn)讀取CSV文件的方法詳解_C 語言
- 2022-12-06 Python基礎(chǔ)面向?qū)ο笾^承與派生詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支