Myqsort:基于冒泡排序算法的C語言實現

????????我們將詳細介紹一個基于冒泡排序算法的自定義排序函數——Mysqrt。該函數通過使用用戶提供的比較函數進行元素間的比較,并結合swap交換函數對任意類型的數據進行排序。下面是對代碼的逐行解析。

邏輯導圖

代碼實現

// 頭文件
#include<stdio.h>// 定義比較函數,用于決定兩個元素之間的大小關系
int Mycompares(const void *p1, const void *p2) {// 這里假設傳入的是整型指針,將指針轉換為整型并做差,返回結果作為比較依據return (*(int*)p1 - *(int*)p2);
}// 定義交換函數,用于交換兩個內存區域的內容
void swap(char* p1, char* p2, size_t size) {for (int i = 0; i < size; i++) {// 臨時變量存儲p1的當前值char tmp = *p1;// 將p2的值賦給p1*p1 = *p2;// 將臨時變量tmp(即原p1的值)賦給p2*p2 = tmp;// 指針指向下一個待交換的元素p1++;p2++;}
}// 自定義冒泡排序函數
void Mysqrt(void* base, size_t num, size_t size, int (*cmp)(const void*, const void*)) {// 遍歷數組,num-1輪冒泡以確保所有元素有機會排序到位for (int i = 0; i < num - 1; i++) {// 內層循環負責每輪冒泡的具體操作for (int j = 0; j < num - 1 - i; j++) {// 使用cmp函數比較相鄰元素的大小if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) {// 如果逆序,則調用swap函數交換兩個元素的位置swap((char*)base + j * size, (char*)base + (j + 1) * size, size);}}}
}// 打印原始數組函數
void Print1(int* p, int sz) {printf("排序前:");for (int i = 0; i < sz; i++) {printf("%d: ", *(p + i));}printf("\n");
}// 打印已排序數組函數
void Print2(int *p, int sz) {printf("排序后:");for (int i = 0; i < sz; i++) {printf("%d: ", *(p + i));}
}// 測試函數
void text() {// 初始化一個整數數組int arr[] = { 2,1,3,6,5,4,9,8,7,0 };// 計算數組元素個數int sz = sizeof(arr) / sizeof(arr[0]);// 輸出原始數組Print1(arr, sz);// 調用Mysqrt對數組進行排序Mysqrt(arr, sz, sizeof(arr[0]), Mycompares);// 輸出排序后的數組Print2(arr, sz);
}// 主函數
int main() {// 調用測試函數text();return 0;
}### 函數參數解釋:- `Mysqrt`函數:- 參數`base`:指向數組起始位置的指針。- 參數`num`:數組中元素的數量。- 參數`size`:每個元素占用的字節數,用于計算元素地址偏移。- 參數`cmp`:指向比較函數的指針,用于決定元素間的大小關系。- `swap`函數:- 參數`p1`和`p2`:分別指向需要交換的兩個元素的起始地址。- 參數`size`:每個元素的大小,用于循環控制交換內容。- `text`函數中調用`Mysqrt`時,`arr`作為`base`參數傳遞,`sz`作為`num`,`sizeof(arr[0])`表示每個整數元素所占的字節數,`Mycompares`作為比較函數提供給`Mysqrt`使用。

注意看注釋

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

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

相關文章

華為自動駕駛技術詳解報告分享

ADS2.0首發搭載問界M5智駕版&#xff0c;城市NCA計劃年底全國開通。2023年4月16日華為在智能汽車解決方案發布會上發布了最新的ADS2.0產品&#xff0c;硬件數量減少至27個(11個攝像頭12個超聲波雷達3個毫米波雷達1個激光雷達,ADS1.0有34個)&#xff0c;車載計算平臺改為MDC610&…

python自學2

第一階段第三章 if&#xff0c;elif&#xff0c;else語句 這個是有順序的&#xff0c;如果第一個滿足下面的就不會執行&#xff0c;else也可以不寫&#xff0c;執行的效果等同于三個獨立的if。 還可以寫的更加簡潔一些 直接輸入的參數帶入到判斷里面去 小練習&#xff1a; 做…

打造專屬投屏體驗:Windows系統投屏到iOS系統

想要將電腦投屏共享給同事或朋友&#xff0c;又擔心隱私內容泄露&#xff1f;來來來&#xff0c;這里有妙招&#xff01; AirDroid Cast網頁版讓電腦投屏變得挑剔&#xff0c;只展示你允許共享的內容。會議資料、個人照片、敏感文件&#xff0c;都將得到嚴格的篩選&#xff0c;…

云原生之容器編排實踐-ruoyi-cloud項目部署到K8S:Nacosv2.2.3

背景 前面搭建好了 Kubernetes 集群與私有鏡像倉庫&#xff0c;終于要進入服務編排的實踐環節了。本系列拿 ruoyi-cloud 項目進行練手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

傳輸層Transport layer (ISO15118-20:2022) (7.7 part1) -- TCPUDP

7.7 Transport layer 這段描述闡明了文檔中子條款及其所有子條款的特定要求,這些要求分別適用于私有SECC(Supply Equipment Communication Controller)和公共SECC。除非在特定子條款或其內部的任何子條款中另有說明,否則不應將私有SECC和公共SECC視為可互換的。 這意味著…

問題解決 | RuntimeError: CUDA error: invalid device ordinalCUDA kernel errors

錯誤&#xff1a; RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING1. Compile with TO…

windows環境下Grafana+loki+promtail入門級部署日志系統,收集Springboot(Slf4j+logback)項目日志

&#x1f339;作者主頁&#xff1a;青花鎖 &#x1f339;簡介&#xff1a;Java領域優質創作者&#x1f3c6;、Java微服務架構公號作者&#x1f604; &#x1f339;簡歷模板、學習資料、面試題庫、技術互助 &#x1f339;文末獲取聯系方式 &#x1f4dd; 往期熱門專欄回顧 專欄…

動態規劃DP之背包問題4---分組背包問題

目錄 DP分析&#xff1a; 例題&#xff1a; 01背包&#xff1a; 一種物品只有一件 動態規劃DP之背包問題1---01背包問題-CSDN博客 完全背包&#xff1a;一種物品有無限件 動態規劃DP之背包問題2---完全背包問題-CSDN博客 多重背包&#xff1a;一種物品有有限…

【三維重建】【SLAM】SplaTAM:基于3D高斯的密集RGB-D SLAM(CVPR 2024)

題目&#xff1a;SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM 地址&#xff1a;spla-tam.github.io 機構&#xff1a;CMU&#xff08;卡內基梅隆大學&#xff09;、MIT&#xff08;美國麻省理工&#xff09; 總結&#xff1a;SplaTAM&#xff0c;一個新…

十個勤天生菜原價4.9元被炒到300元,2024新商機!新興創業項目!

近日&#xff0c;一則關于生菜價格暴漲的新聞引起了廣泛關注。原價4.9元的生菜&#xff0c;在短短時間內被炒至300元&#xff0c;令人咋舌。在這背后&#xff0c;除了市場供需失衡、炒作等因素外&#xff0c;我們不禁思考&#xff1a;這樣的現象背后是否隱藏著更大的商機&#…

怎么更改淘寶開店時間

更改淘寶開店時間的注意事項與建議 在淘寶上開店&#xff0c;對于許多賣家來說&#xff0c;選擇合適的開店時間是非常重要的。本文將為您介紹如何更改淘寶開店時間&#xff0c;以及在更改過程中需要注意的事項和建議。 一、如何更改淘寶開店時間 在淘寶上更改開店時間相對簡…

LaTeX插入圖片占位符

關于插入圖片更多說明&#xff08;多圖并排、子標題設置等&#xff09;可參考鏈接 LaTeX插入圖片 插入圖片占位符 參考鏈接&#xff1a;https://blog.csdn.net/yq_forever/article/details/129431799 在論文草稿階段有的時候想先插入圖片占位符擬定大綱或寫作思路&#xff0…

張宇30講學習筆記

初等數學 x \sqrt{x} x ?是算數平方根&#xff0c;一定≥0&#xff1b; x 2 \sqrt{x^2} x2 ?|x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0&#xff0c;b>0&#xff0c;則ab≥2 a b \sqrt{ab} ab ? 對數 ln a b \frac{a}{b} ba?lna-lnb 高等數學 單調性 線性代數

Linux CentOS使用Docker部署Apache Superset并實現遠程分析數據

文章目錄 前言1. 使用Docker部署Apache Superset1.1 第一步安裝docker 、docker compose1.2 克隆superset代碼到本地并使用docker compose啟動 2. 安裝cpolar內網穿透&#xff0c;實現公網訪問3. 設置固定連接公網地址 前言 Superset是一款由中國知名科技公司開源的“現代化的…

WordPress排除調用某個分類下的文章

wordpress在調用分類下文章時&#xff0c;有時需要排除調用某個分類的文章&#xff0c;下面的這段代碼&#xff0c;就可以輕松實現不調用特定ID的分類內容。 <?phpquery_posts("showposts10&cat-1"); //cat-1為排除ID為1的分類下文章while(have_posts()) : …

編譯適用于RK3588的Redroid鏡像

編譯適用于RK3588的Redroid鏡像 不想編譯的話可以用筆者的鏡像&#xff1a; GitHub鏈接 引言 Redroid是什么&#xff0c;不想多說&#xff0c;一個詞總結: 云手機 準備工作 AOSP代碼一堆&#xff0c;編譯起來要命&#xff0c;所以租個高配服務器&#xff0c;筆者用的是Vul…

自動化構建平臺(一)Linux下搭建私有代碼倉庫Gitblit的安裝和使用詳解

文章目錄 前言一、Gitblit的安裝和使用1、本地安裝2、docker下安裝3、Gitblit使用簡介4、Gitblit倉庫權限控制5、Gitblit郵件配置 總結 前言 代碼版本管理&#xff0c;git模式應該是目前最流行的代碼管理軟件。目前支持git的管理軟件有很多。 Gitblit是一個小型的代碼倉庫管理…

《GitHub新手入門指南:從零開始掌握基本用法》

在現代軟件開發和技術社區中,GitHub已經成為了一個不可或缺的平臺。它不僅是一個代碼托管平臺,更是一個技術交流、學習分享的社交平臺。但對于初學者來說,GitHub可能會有些令人望而卻步。本文將詳細介紹GitHub的基本用法,幫助新手快速入門并融入這個充滿活力的技術社區。 …

Qt/C++音視頻開發67-保存裸流加入sps/pps信息/支持264/265裸流/轉碼保存/拉流推流

一、前言 音視頻組件除了支持保存MP4文件外&#xff0c;同時還支持保存裸流即264/265文件&#xff0c;以及解碼后最原始的yuv文件。在實際使用過程中&#xff0c;會發現部分視頻文件保存的裸流文件&#xff0c;并不能直接用播放器播放&#xff0c;查閱資料得知原來是缺少sps/p…

OpenDocCN 20240303 更新

GeekDoc Python 譯文集 PythonBasics 中文系列教程PythonGuru 中文系列教程PythonLand 中文系列教程PythonSpot 中文系列教程 GeekDoc Java 譯文集 Effective Java 中文第三版JavaBeginnersTutorial 中文系列教程JavaTutorialNetwork 中文系列教程Java 8 簡明教程Thinking i…