用冒泡排序法模擬qsort函數

目錄

1.前言

2.qsort函數的介紹

?3.冒泡法回顧

4.模擬qsort---buble_sort

4.1 buble_sort格式

4.2 主函數,以int類型為例

4.3comp_int函數的功能設計

4.4 swap函數的功能設計

5. 總代碼概覽


1.前言

今天,小鄧兒帶大家用冒泡排序法來模擬一下qsort函數,廢話不都說,咱們開整。

2.qsort函數的介紹

void qsort( void *base,? ? ?//指向的要比較數組的起始地址

? ? ? ? ? ? ? ? ? ? ?size_t num,? ?// 數組大小(元素總數)

? ? ? ? ? ? ? ? ? ? ?size_t width,? ?//數組中一個元素的大小(單位字節)

? ? ? ? ? ? ? ? ? ? ? int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

? ? ? ? ? ? ? ? ? ? ?//比較elem1和elem2的大小,下圖為qsort函數第4個參數的描述?

3.冒泡法回顧???????

一共進行sz-1趟循環,每一趟又依次比較一個數和它后面一個數的大小,最終按從小到大的默認順序進行排列。

4.模擬qsort---buble_sort

4.1 buble_sort格式

void bubble_sort(void* base,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int sz,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int width,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int(*comp)(const void*, const void*));

具體函數內部情況如下圖

這里的bublue_sort函數,先是會調用comp函數進行兩個數的比較,經過判斷后,再會調用swap函數進行交換

4.2 主函數,以int類型為例

現在,咱們需要用comp_int來模擬實現compare函數的功能。

4.3comp_int函數的功能設計

int comp_int(const void* e1, const void* e2)
{
?? ?return *(int*)e1 - *(int*)e2;
}

//這里參考下圖compare的功能

Return ValueDescription
< 0elem1 less than elem2
0elem1 equivalent to elem2
> 0

elem1 greater than elem2

4.4 swap函數的功能設計

5. 總代碼概覽

#include<stdio.h>
#include<string.h>
int comp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
void swap(char* e1, char* e2, int width)
{int i = 0;for (i = 0; i < width;i++){int t = *e1;*e1 = *e2;*e2 = t;e1++;e2++;}
}
void bubble_sort(void* base,int sz,int width,int(*comp)(const void*, const void*))//傳過來的形參是指針
{int i, j;for (i = 0; i < sz - 1; i++){int flag = 1;//按從小到大順序排列for (j = 0; j < sz - 1 - i; j++){if (comp((char*)base + j * width, (char*)base + (j + 1) * width )>0)//comp的實參是兩個地址{swap((char*)base + j * width, (char*)base + (j + 1) * width,width);flag = 0;//未按順序排列}}if (flag == 1){break;}}
}
void Print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
int main()
{int arr[] = { 1,2 ,4 ,3, 6,5,7,9,0 };int sz ;sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), comp_int);Print(arr,sz);
}

好了,小鄧兒今天的分享就到這里了,歡迎老鐵們點贊收藏😄😄😄

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

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

相關文章

全星研發項目管理APQP軟件系統:鑄造芯片集成電路產業研發體系化建設平臺

全星研發項目管理APQP軟件系統&#xff1a;鑄造芯片集成電路產業研發體系化建設平臺 在芯片集成電路行業&#xff0c;研發效率和質量直接決定了企業的核心競爭力。面對日益復雜的芯片設計、日益縮短的產品生命周期以及日益嚴格的質量要求&#xff0c;傳統的研發管理模式已難以滿…

《Python實戰進階》No 11:微服務架構設計與 Python 實現

第11集&#xff1a;微服務架構設計與 Python 實現 2025年3月3日更新了代碼和微服務運行后的系統返回信息截圖&#xff0c;所有代碼在 python3.11.5虛擬環境下運行通過。 微服務架構通過將復雜應用拆分為獨立部署的小型服務&#xff0c;顯著提升了系統的可擴展性和維護性。本集…

USRP7440-通用軟件無線電平臺

1、產品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架構&#xff0c;它將射頻ADC、DAC、ARM、FPGA等集成一體&#xff0c;瞬時帶寬可以達到2.5GHz&#xff0c;尤其適合于射頻直采應用&#xff0c;比如通信與雷達。 第一代RFSOC高達4GHz ? 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式構建Spring Boot項目

本實戰概述介紹了如何使用Spring Initializr創建Spring Boot項目&#xff0c;并進行基本配置。首先&#xff0c;通過Spring Initializr生成項目骨架&#xff0c;然后創建控制器HelloController&#xff0c;定義處理GET請求的方法hello&#xff0c;返回HTML字符串。接著&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

題目鏈接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛蟲嗎&#xff1f; 思路&#xff1a; 其實很簡單&#xff0c;假設我們要滿足題目所給條件&#xff0c;那么這個毛毛蟲最壞情況下肯定是一條如下圖所示的無向圖 右端省略號為對稱圖形 &…

不謂俠--記錄

音樂《不謂俠》 衣襟上 別好了晚霞 余暉送我牽匹老馬 正路過 煙村里人家 恰似當年故里正飛花 醉過風 喝過茶 尋常巷口尋個酒家 在座皆算老友 碗底便是天涯 天涯遠 無處不為家 蓬門自我也像廣廈 論意氣 不計多或寡 占三分便敢自稱為俠 刀可捉 拳也耍 偶爾閑來…

不同規模企業如何精準選擇AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析與對比

本文深入探討了最近國內外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技術細節、性能表現、應用場景及局限性&#xff0c;并從技術能力、功能需求、成本預算、數據安全和合規以及服務與支持五個關鍵維度&#xff0c;詳細分析了不同規模企業在選擇 AI 工具時的考量因素…

Vue核心知識:KeepLive全方位分析

KeepAlive 是 Vue 組件中的一個重要功能&#xff0c;主要用于緩存組件&#xff0c;以提升性能和用戶體驗。 目錄 一、KeepAlive 基本概念二、KeepAlive 的核心原理三、KeepAlive 關鍵屬性解析1. include&#xff1a;指定需要緩存的組件2. exclude&#xff1a;指定不需要緩存的組…

【電力——tarjan割點,求連通塊】

題目 分析 這是割點的板子 代碼 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一條邊a->b {e[idx] b, ne[idx] h…

【HTTP】解碼網絡通信的奧秘:HTTP,IP 地址,端口,DNS及NAT地址轉換的協同之舞

引言 每文學習一句詩&#xff1a;行一棋不足以見智&#xff0c;彈一弦不足以見悲 ——《淮南子說林訓》 譯文&#xff1a;走一個棋子&#xff0c;不足以現出智慧&#xff1b;彈一根琴弦&#xff0c;不能夠使人產生悲哀之情。 自述&#xff1a;互聯網現如今已經成為每個人都離不…

18、深拷貝與淺拷貝的區別【中高頻】

淺拷貝 淺拷貝只是拷貝了一個指針&#xff0c;并沒有開辟一塊新的內存。拷貝的指針和原來的指針 指向同一塊地址。當一個對象修改了資源&#xff0c;另一個對象也會受到影響&#xff0c;因此淺拷貝是有風險的&#xff1a;當兩個對象都銷毀 并調用析構函數時&#xff0c;會造成…

【Linux】從入門到精通:Make與Makefile完全指南

歡迎來到 CILMY23 的博客 &#x1f3c6;本篇主題為&#xff1a;從入門到精通&#xff1a;Make與Makefile完全指南 &#x1f3c6;個人主頁&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列專欄&#xff1a;C | C語言 | Linux | Python | 數據結構和算法 | 算法專題 &#x1…

利用PyQt簡單的實現一個機器人的關節JOG界面

在上一篇文章中如何在Python用Plot畫出一個簡單的機器人模型&#xff0c;我們介紹了如何在Python中畫出一個簡單的機器人3D模型&#xff0c;但是有的時候我們需要通過界面去控制機器人每一個軸的轉動&#xff0c;并實時的顯示出當前機器人的關節位置和末端笛卡爾位姿。 那么要實…

iOS 使用消息轉發機制實現多代理功能

在iOS開發中&#xff0c;我們有時候會用到多代理功能&#xff0c;比如我們列表的埋點事件&#xff0c;需要我們在列表的某個特定的時機進行埋點上報&#xff0c;我們當然可以用最常見的做法&#xff0c;就是設置代理實現代理方法&#xff0c;然后在對應的代理方法里面進行上報&…

XGBoost和LightGBM機器學習算法對比及實戰

文章目錄 1. XGBoost 原理核心思想關鍵技術點2. LightGBM 原理核心思想關鍵技術點3. XGBoost vs LightGBM 對比4. 適用場景選擇5. 總結1. 數據準備2. XGBoost 示例安裝庫代碼實現3. LightGBM 示例安裝庫代碼實現4. 關鍵參數對比5. 注意事項6. 輸出示例XGBoost 和 LightGBM 是兩…

局域網自動識別機器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 確定了設備唯一性 V1.1 局域網自動識別機器名和MAC并生成文件的批處理命令 echo off setlocal enabledelayedexpansionREM 設置輸出文件 set outputFilenetwork_info.txtREM 清空或創建輸出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue開發的體育用品商城管理系統源碼+開發文檔+課程作業

項目簡介 該項目是基于PythonVue開發的體育用品商城管理系統&#xff08;前后端分離&#xff09;&#xff0c;這是一項為大學生課程設計作業而開發的項目。該系統旨在幫助大學生學習并掌握Python編程技能&#xff0c;同時鍛煉他們的項目設計與開發能力。通過學習基于Python的體…

pyQT5簡易教程(一):制作一個可以選擇本地圖片并顯示的桌面應用

可以參考之前的教程安裝 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打開pycharm中的QTdesigner 二、設計界面 和之前一樣,使用 PyQt Designer 來設計界面并保存為 .u…

LeetCode 解題思路 6(Hot 100)

解題思路&#xff1a; 初始化窗口元素&#xff1a; 遍歷前 k 個元素&#xff0c;構建初始單調隊列。若當前索引對應值大于等于隊尾索引對應值&#xff0c;移除隊尾索引&#xff0c;將當前索引加入隊尾。遍歷結束時當前隊頭索引即為當前窗口最大值&#xff0c;將其存入結果數組…

基于redis的位圖實現簽到功能

基于Redis位圖實現簽到功能是一種高效且節省內存的方法。以下是分步實現的詳細方案&#xff1a; 1. 鍵設計策略 采用 sign:<userId>:<YYYYMM> 格式存儲每月簽到數據 # 示例&#xff1a;用戶1001在2023年8月的簽到數據 sign_key "sign:1001:202308"2.…