用 C 語言實現通用的冒泡排序算法

在日常編程中,排序算法是一個非常常見且重要的工具。雖然有許多排序算法可以選擇,但如果你需要一個能夠處理不同數據類型的排序算法,如何設計一個通用的排序算法呢?今天我們將實現一個通用的冒泡排序算法,支持不同數據類型的排序,并且使用函數指針來提供靈活的比較方式。

1. 冒泡排序算法簡介

冒泡排序是一種簡單的排序算法,其工作原理是通過不斷交換相鄰元素,使得每次遍歷都能將最大的元素“冒泡”到數組的末端。它的時間復雜度是 O(n2),雖然不適合排序大數據量的情況,但由于實現簡單,它仍然是學習排序算法時非常有用的工具。

2. 通用冒泡排序的實現思路

我們要實現一個通用的冒泡排序,即可以處理任意類型的數組(整數、浮點數、字符串等)。為了實現這一點,我們需要考慮以下幾個要點:

  • 類型無關性:使用?void *?來表示數組元素,這樣可以讓函數支持處理任意類型的數據。
  • 比較函數:使用函數指針來允許用戶定義比較邏輯,確保排序可以根據用戶的需求進行。
  • 內存操作:我們將使用?memcpy?來交換數組元素,這樣可以處理任意大小的元素。

3. 代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 通用比較函數的類型
typedef int (*CompareFunc)(const void *, const void *);// 通用冒泡排序函數
void bubbleSort(void *base, size_t num, size_t size, CompareFunc compare) {unsigned char *arr = (unsigned char *)base;for (size_t i = 0; i < num - 1; i++) {int swapped = 0;for (size_t j = 0; j < num - i - 1; j++) {unsigned char *a = arr + j * size;unsigned char *b = arr + (j + 1) * size;if (compare(a, b) > 0) {unsigned char temp[size];memcpy(temp, a, size);memcpy(a, b, size);memcpy(b, temp, size);swapped = 1;}}if (!swapped) {break;}}
}// 示例比較函數:用于排序整數
int compareInt(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}// 示例比較函數:用于排序浮點數
int compareFloat(const void *a, const void *b) {if (*(float *)a < *(float *)b) return -1;if (*(float *)a > *(float *)b) return 1;return 0;
}// 打印數組的函數
void printArray(void *base, size_t num, size_t size, void (*printElem)(const void *)) {unsigned char *arr = (unsigned char *)base;for (size_t i = 0; i < num; i++) {printElem(arr + i * size);}printf("\n");
}// 打印整數數組元素
void printInt(const void *a) {printf("%d ", *(int *)a);
}// 打印浮點數數組元素
void printFloat(const void *a) {printf("%.2f ", *(float *)a);
}int main() {// 測試整數數組int arrInt[] = {64, 34, 25, 12, 22, 11, 90};size_t numInt = sizeof(arrInt) / sizeof(arrInt[0]);printf("排序前的整數數組: ");printArray(arrInt, numInt, sizeof(int), printInt);bubbleSort(arrInt, numInt, sizeof(int), compareInt);printf("排序后的整數數組: ");printArray(arrInt, numInt, sizeof(int), printInt);// 測試浮點數數組float arrFloat[] = {64.5, 34.2, 25.1, 12.9, 22.7, 11.6, 90.3};size_t numFloat = sizeof(arrFloat) / sizeof(arrFloat[0]);printf("排序前的浮點數數組: ");printArray(arrFloat, numFloat, sizeof(float), printFloat);bubbleSort(arrFloat, numFloat, sizeof(float), compareFloat);printf("排序后的浮點數數組: ");printArray(arrFloat, numFloat, sizeof(float), printFloat);return 0;
}

代碼解析

  1. bubbleSort 函數

    • 我們使用?void *base?來表示數組指針,使得這個函數能夠處理不同類型的數組。
    • size_t size?表示每個元素的大小,CompareFunc compare?是一個函數指針,允許用戶傳入自定義的比較函數。
    • 在排序過程中,我們通過?memcpy?來交換元素,因為?void *?是不確定類型的指針,直接操作可能會出錯。
  2. compareIntcompareFloat 函數

    • compareInt?函數用于比較整數,compareFloat?函數用于比較浮點數。你可以根據需要,定義更多的比較函數來支持其他數據類型。
  3. printArray 函數

    • 該函數用于打印數組,支持任何類型的元素。通過傳入打印函數?printElem,我們可以根據不同的數據類型打印不同的元素。

示例輸出

排序前的整數數組: 64 34 25 12 22 11 90 
排序后的整數數組: 11 12 22 25 34 64 90 
排序前的浮點數數組: 64.50 34.20 25.10 12.90 22.70 11.60 90.30 
排序后的浮點數數組: 11.60 12.90 22.70 25.10 34.20 64.50 90.30 

4. 總結

本文實現了一個通用的冒泡排序函數,支持對任意類型的數組進行排序。通過使用 void * 指針和函數指針,我們使得排序函數具有很好的靈活性和可擴展性。無論是整數、浮點數還是其他類型的數組,只需要提供合適的比較函數,就可以輕松進行排序。

這種通用的排序實現方式,可以在很多場景中得到應用,特別是在處理不同類型數據的庫函數中。如果你正在開發一個庫,并且需要支持不同類型的數據,類似的實現方式會非常有用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78286.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78286.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78286.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 變量全解析:聲明、初始化與使用

在多用途的編程語言中&#xff0c;程序存取數據是一項基礎且關鍵的功能&#xff0c;而這一功能主要通過變量來實現。本文將全面深入地探討 C# 中的變量&#xff0c;包括變量的種類、聲明、初始化、自動初始化、多變量聲明以及如何使用變量的值。 變量概述 變量是一個名稱&…

Dify中的文本分詞處理技術詳解

Dify中的文本分詞處理技術詳解 引言核心架構概覽索引處理器工廠 文本分詞技術詳解基礎分詞器增強型遞歸字符分詞器固定分隔符文本分詞器遞歸分割算法 索引處理器中的分詞應用特殊索引處理器的分詞特點問答索引處理器父子索引處理器 分詞技術的應用場景技術亮點與優勢總結 引言 …

如何打包python程序為可執行文件

將 Python 程序打包為可執行文件是一個常見需求&#xff0c;尤其是在希望將應用程序分享給不具備 Python 環境的用戶時。以下是使用 PyInstaller 工具將 Python 程序打包為可執行文件的步驟。 步驟 1&#xff1a;安裝 PyInstaller 如果您還沒有安裝 PyInstaller&#xff0c;請…

美團Java后端二面面經!

場景題是面試的大頭&#xff0c;建議好好準備 Q. [美團]如何設計一個外賣訂單的并發扣減庫存系統&#xff1f; Q.[美團]為啥初始標記和重新標記需要STW&#xff1f; Q.[美團]騎手位置實時更新&#xff0c;如何保證高并發寫入&#xff1f; Q.[美團]訂單表數據量過大導致查詢…

在應用運維過程中,業務數據修改的證據留存和數據留存

在應用運維過程中,業務數據修改的證據留存和數據留存至關重要,以下是相關介紹: 一、證據留存 操作日志記錄 : 詳細記錄每一次業務數據修改的操作日志,包括操作人員、操作時間、修改內容、修改前后數據的對比等。例如,某公司業務系統中,操作日志會精確記錄員工小張在 2…

Eigen迭代求解器類

1. 迭代求解器核心類概覽 Eigen 提供多種迭代法求解稀疏線性方程組 AxbAxb&#xff0c;適用于大規模稀疏矩陣&#xff1a; 求解器類適用矩陣類型算法關鍵特性ConjugateGradient對稱正定&#xff08;SPD&#xff09;共軛梯度法&#xff08;CG&#xff09;高精度&#xff0c;內…

ORACLE數據庫備份入門:第四部分:2-備份場景舉例

下面以4個常見的場景為例&#xff0c;介紹如何規劃備份方案。備份方案沒有標準答案&#xff0c;需要根據實現情況來制定&#xff0c;也和管理員的個人使用習慣有很大相關性。 1 交易型數據庫備份 以銀行的交易系統為例&#xff0c;除了前一章節提到的關于RPO和RTO的指標外&am…

小白如何學會完整挪用Github項目?(以pix2pix為例)

[目錄] 0.如何完整地復現/應用一個Github項目 1.建立適用于項目的環境 2.數據準備與模型訓練階段 3.訓練過程中的一些命令行調試必備知識0.如何完整地復現/應用一個Github項目 前日在健身房的組間同一位好友交流時&#xff0c;得到了一個一致結論—— ** Github \texttt{Githu…

藍橋杯 5. 交換瓶子

交換瓶子 原題目鏈接 題目描述 有 N 個瓶子&#xff0c;編號為 1 ~ N&#xff0c;放在架子上。 例如有 5 個瓶子&#xff0c;當前排列為&#xff1a; 2 1 3 5 4每次可以拿起 2 個瓶子&#xff0c;交換它們的位置。 要求通過若干次交換&#xff0c;使得瓶子的編號從小到大…

Linux 系統滲透提權

Linux 系統滲透提權 比賽題庫-Linux 系統滲透提權 文章目錄 Linux 系統滲透提權比賽題庫-Linux 系統滲透提權 前言一、解題過程1.使用滲透機對服務器信息收集&#xff0c;并將服務器中 SSH 服務端口號作為 flag 提 交&#xff1b;2.使用滲透機對服務器信息收集&#xff0c;并將…

華為OD機試真題——查找接口成功率最優時間段(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C、GO六種語言的最佳實現方式&#xff1b; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析&#xff1b; 本文收錄于專欄&#xff1a;《2025華為OD真題目錄…

華為OD機試真題——繪圖機器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 本文收錄于專欄&#xff1a;《2025華為OD真題目錄全流程解析/備考攻略/經驗…

基于 Python(selenium) 的百度新聞定向爬蟲:根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容

該項目能夠根據輸入的關鍵詞在百度新聞上進行搜索,并爬取新聞詳情頁的內容。 一、項目準備 1. 開發環境配置 操作系統:支持 Windows、macOS、Linux 等主流操作系統,本文以 Windows 為例進行說明。Python 版本:建議使用 Python 3.8 及以上版本,以確保代碼的兼容性和性能。…

MySQL表的操作 -- 表的增刪改查

目錄 1. 表的創建2. 表的查看3. 表的修改4. 表的刪除5. 總結 1. 表的創建 1.查看字符集及效驗規則 2. 表的創建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲引擎;創建用戶表1 創建用…

如何解決極狐GitLab 合并沖突?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 合并沖突 (BASIC ALL) 合并沖突發生在合并請求的兩個分支&#xff08;源分支和目標分支&#xff09;對相同代碼行進行了不同…

oracle不同數據庫版本的自增序列

-- 查看數據庫版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 語法 id NUMBER GENER…

VIC-3D非接觸全場應變測量系統用于小尺寸測量之電子元器件篇—研索儀器DIC數字圖像相關技術

在5G通信、新能源汽車電子、高密度集成電路快速迭代的今天&#xff0c;電子元件的尺寸及連接工藝已進入亞毫米級競爭階段&#xff0c;這種小尺寸下的力學性能評估對測量方式的精度有更高的要求&#xff0c;但傳統應變測量手段常因空間尺寸限制及分辨率不足難以捕捉真實形變場。…

pod 創建私有庫指南

步驟 參考&#xff1a;iOS Pod 私有庫創建指南-百度開發者中心 下面主要是對參考鏈接里面的解釋&#xff1a; 創建兩個倉庫&#xff1a; 一個叫podframe.git&#xff0c;用來存放自定義的framework&#xff0c;比如TestPodFrame.framework一個叫podspec.git&#xff0c;用來…

【JavaEE】Spring AOP的注解實現

目錄 一、AOP 與 Spring AOP二、Spring AOP簡單實現三、詳解Spring AOP3.1 Spring AOP 核心概念3.1.1 切點&#xff08;Pointcut&#xff09;3.1.2 連接點&#xff08;Join Point&#xff09;3.1.3 通知&#xff08;Advice&#xff09;3.1.4 切面&#xff08;Aspect&#xff09…

協作開發攻略:Git全面使用指南 — 結語

協作開發攻略&#xff1a;Git全面使用指南 — 結語 Git 是一種分布式版本控制系統&#xff0c;用于跟蹤文件和目錄的變更。它能幫助開發者有效管理代碼版本&#xff0c;支持多人協作開發&#xff0c;方便代碼合并與沖突解決&#xff0c;廣泛應用于軟件開發領域。 文中內容僅限技…