qsort函數的模擬實現(冒泡排序模擬)

冒泡排序:

從第一個元素開始,依次比較相鄰的兩個元素,如果順序不對就交換它們。

經過一輪遍歷后,最大(或最小)的元素會排在最后。

重復進行上述步驟,直到沒有任何元素需要交換,即列表已經有序。

以上是一個冒泡排序,需要對它進行改進。

參考我寫的
qsort函數(任意類型數據排序)-CSDN博客文章瀏覽閱讀61次。int (*compar)(const void*p1, const void*p2),返回值是int 類型,返回值是一個整形,函數指針會根據返回值 >0 ==0https://blog.csdn.net/bkmoo/article/details/136356436?spm=1001.2014.3001.5501

由于冒泡排序的趟數不需要改變,因此需要改變1參數與比較用的2if(j = 0; j < sz - 1 - i; j++),3互換的功能int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;這三塊。

一、

void 接收任意類型 size_t無符號整形。因此前三個參數設置為了void* base, size_t sz, size_t length

if比較這里用int類型,第四個參數又要回調函數。因此第四個參數為int類型的函數指針int(*cmp)(const void* p1, const void* p2))

void bubble_sort(void* base, size_t sz, size_t length, int(*cmp)(const void* p1, const void* p2))
{
?? ?int i = 0;
?? ?for (i = 0; i < sz - 1; i++)
?? ?{
?? ??? ?int j = 0;
?? ??? ?for (j = 0; j < sz - 1 - i; j++)//sz - 1 - i
?? ??? ?{
?? ??? ??? ?if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0) ?//寬度!第一個元素與第二個元素之間的間隔用char類型(一個字節),
?? ??? ??? ?{
?? ??? ??? ??? ?swap((char*)base + j * length, (char*)base + (j + 1)* length, length);
?? ??? ??? ?}
?? ??? ?}
?? ?}
}

二、

關鍵在if比較這里,cmp為回調函數(比較大小的函數<0,?=0,>0 ),回調函數中的兩個參數很重要。

base為void* 類型,強制類型轉換為char類型,char類型長度為1字節(我喜歡叫它手術刀),這里傳遞的一個元素的長度length就很關鍵,每次跳過一個char*length長度(一個元素長度)這樣就可以接收任意長度的元素了。

? ?if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0)

三、

接著就是交換功能的實現。比如傳遞的是int類型的,length就是4,char*p1與char*p2隔著四個字節,兩兩互換就可以實現兩個元素的交換。

傳遞的是指針,需要先解引用出內容后進行交換。

swap((char*)base + j * length, (char*)base + (j + 1)* length, length);

void swap(char* p1, char* p2, size_t length)
{
?? ?int i = 0;
?? ?for (i = 0; i < length; i++)
?? ?{
?? ??? ?char cmp = *p1;
?? ??? ?*p1 = *p2;
?? ??? ?*p2 = cmp;
?? ??? ?p1++;
?? ??? ?p2++;
?? ?}
}

最后回調函數是由程序員自己設計,根據比較的類型或結構體,自己的需求,設置回調函數

例 :這里我比較的數組,設置了cmp_arr函數進行比較。

void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}void swap(char* p1, char* p2, size_t length)
{int i = 0;for (i = 0; i < length; i++){char cmp = *p1;*p1 = *p2;*p2 = cmp;p1++;p2++;}
}void bubble_sort(void* base, size_t sz, size_t length, int(*cmp)(const void* p1, const void* p2))
{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;for (j = 0; j < sz - 1 - i; j++)//sz - 1 - i{if (cmp((char*)base + j * length,(char*)base+ (j + 1)* length)> 0)  //寬度!第一個元素與第二個元素之間的間隔用char類型(一個字節),{swap((char*)base + j * length, (char*)base + (j + 1)* length, length);}}}
}int cmp_arr(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}int main()
{int arr[] = { 1,3,2,5,6,4,9,7,8 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);bubble_sort(arr,sz,sizeof(arr[0]),cmp_arr);print(arr, sz);return 0;
}

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

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

相關文章

Linux了解

簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由芬蘭的Linus Torvalds于1991年首次發布。Linux最初是作為支持英特爾x86架構的個人電腦的一個自由操作系統&#xff0c;現在已經被移植到更多的計算機硬件平臺&#xff0c;如手機、平板電腦、路由器、視頻游戲控…

爬蟲入門到精通_實戰篇8(分析Ajax請求并抓取今日頭條美食美圖)_界面上抓取Ajax方式

1 目標 目標&#xff1a; 抓取今日頭條美食美圖&#xff0c;如下&#xff1a; 一些網頁直接請求得到的HTML代碼并沒有在網頁中看到的內容&#xff0c;因為一些信息是通過Ajax加載&#xff0c;并通過js渲染生成的&#xff0c;這時就需要通過分析網頁的請求來獲取想要爬取的內容…

解決conda環境下import TensorFlow失敗的問題

問題描述 安裝了anaconda的電腦&#xff0c;新建了一個名叫deeplearning的環境&#xff0c;在該環境下已經成功安裝了tensorflow。 于是在終端打開python并執行代碼 import tensorflow as tf print(1)除了提示 2024-02-27 21:50:00.801427: I external/local_tsl/tsl/cuda/c…

CSS 盒子模型(box model)

概念 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"這一術語是用來設計和布局時使用CSS盒模型本質上是一個盒子&#xff0c;封裝周圍的HTML元素&#xff0c;它包括&#xff1a;外邊距(margin)&#xff0c;邊框(border)&#xff0c;內邊距(pad…

關于 HTTP 協議,你了解多少

HTTP協議 FastAPI 是建立在 HTTP 協議之上&#xff0c;所以為了更好的掌握 FastAPI。我們需要先簡單的了解一下 HTTP協議 簡介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;遵循經典的客戶端-服務器模型&#xff0c;客戶端打開連接以發出請求&#xff0c;然后等…

【Go語言】Go語言中的流程控制

Go語言中的流程控制 流程控制主要用于設定計算執行的順序&#xff0c;簡歷程序的邏輯結果&#xff0c;Go語言的流程控制語句與其他語言類似&#xff0c;支持如下幾種流程控制語句&#xff1a; 條件語句&#xff1a;用于條件判斷&#xff0c;對應的關鍵字有if、else和else if&a…

SQL 語句的執行順序

數據庫引擎在執行SQL語句并不是從SELECT開始執行&#xff0c;而是從FROM開始&#xff0c;執行順序如下(關鍵字前面的數字代表SQL執行的順序步驟)&#xff1a; ⑧SELECT ⑨DISTINCT ⑩①【Top Num】 【select list】 ①FROM {left_table_name} ③【join_type】 JOIN {righ…

vuecli配置sass

vuecli5如何配置sass sass有很多優勢&#xff0c;可以減少css重復&#xff0c;提高效率等&#xff0c;本人使用了 vuecli5 node -v 查看node版本根據版本安裝node-sass sass-loader 如我的版本“node-sass”: “^4.14.1”,“sass-loader”: “^7.1.0”,node -vv14.15.0&#…

使用 Docker 部署 Fiora 在線聊天室平臺

一、Fiora 介紹 Fiora 簡介 Fiora 是一款開源免費的在線聊天系統。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注冊賬號并登錄&#xff0c;可以長久保存你的數據加入現有群組或者創建自己的群組&#xff0c;來和大家交流和任意人私聊&#xff0c;并添…

MySQL 主從讀寫分離入門——基本原理以及ProxySQL的簡單使用

一、讀寫分離工作原理 讀寫分離的工作原理&#xff1a;在大型網站業務中&#xff0c;當單臺數據庫無法滿足并發需求時&#xff0c;通過主從同步方式同步數據。設置一臺主服務器負責增、刪、改&#xff0c;多臺從服務器負責查詢&#xff0c;從服務器從主服務器同步數據以保持一…

C語言數據結構——隊列

目錄 0.前言 1.隊列的基本概念 2.隊列的實現 2.1實現方式 2.2具體實現 3.隊列的應用場景 4.一道隊列的算法題&#xff08;LeetCode225. 用隊列實現棧&#xff09; 5.結語 &#xff08;圖像由AI生成&#xff09; 0.前言 在計算機科學領域&#xff0c;數據結構是組織和…

Linux篇: 進程控制

一、進程創建 1.1 fork函數初識 在Linux中&#xff0c;fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個新進程。新進程為子進程&#xff0c;而原進程為父進程。 返回值&#xff1a; 在子進程中返回0&#xff0c;父進程中返回子進程的PID&#xff0c;子進程創…

OSI七層模型/TCP四層模型

協議&#xff1a; 協議是雙方共同指定的一組規則&#xff0c;在網絡通信中表示通信雙方傳遞數據和解釋數據的一組規則。 從A上傳文件到服務器B,需要在A和B之間制定一個雙方都認可的規則&#xff0c;這個規則就叫文件傳輸協議&#xff0c;該協議是ftp協議的一個初級版本&#…

LeetCode 刷題 [C++] 第226題.翻轉二叉樹

題目描述 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 題目分析 深度優先搜索&#xff08;DFS&#xff09;- 遞歸方式 對于二叉樹的鏡像問題&#xff0c;很容易想到的就是使用遞歸來解決&#xff0c;自底向上依次翻轉每一個節點…

2024年騰訊云優惠券領取頁面_代金券使用方法_新老用戶均可

騰訊云代金券領取渠道有哪些&#xff1f;騰訊云官網可以領取、官方媒體賬號可以領取代金券、完成任務可以領取代金券&#xff0c;大家也可以在騰訊云百科蹲守代金券&#xff0c;因為騰訊云代金券領取渠道比較分散&#xff0c;騰訊云百科txybk.com專注匯總優惠代金券領取頁面&am…

『大模型筆記』Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢

Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢 文章目錄 一. 摘要二. 引言楊立昆推薦的關于世界模型的真正含義(或應該是什么)的好文章。原文:Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models譯文:Sora探索大型…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前說過我不打算寫這個快速排序。 首先&#xff0c;我從來沒有在自己的網站上操作過所謂的快速排序。 其次&#xff0c;我不能像網上很多人寫的那樣透露百度快速排序的秘密&#xff08;說實話&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Linux系統運維腳本:編寫bash腳本程序監控服務器的磁盤空間,在磁盤使用率超過閾值時發送警告郵件

目 錄 一、要求 二、解決方案 &#xff08;一&#xff09;解決思路 &#xff08;二&#xff09;方案 三、腳本程序實現 &#xff08;一&#xff09;腳本代碼和解釋 1、腳本代碼 2、代碼解釋 &#xff08;二&#xff09;腳本驗證 1、腳本編輯 2、給予執…

使用遞歸求解數組最大值(c++題解)

題目描述 輸入一個整數n&#xff08;n不大于1000&#xff09;&#xff0c;接下來分別為n個整數&#xff0c;請使用遞歸求取最大值。 輸入格式 第一行&#xff1a;正整數n。 第二行&#xff1a;n個整數。 輸出格式 輸出最大值 樣例 樣例輸入 復制2 1 2樣例輸出 復制2 …

Postman: 前端必備工具還是后端獨享利器

Postman 的使用場景&#xff1a;適用于前端和后端 Postman 是一個流行的 API 測試與開發工具。它被廣泛地應用在前后端開發的過程中&#xff0c;但是很多人對于它的使用場景存在疑惑。那么&#xff0c;到底是前端用還是后端用呢&#xff1f;本文將從多個角度詳細解答這個問題。…