C語言冒泡排序(高級版)

目錄:

? ? ? ? ? ?冒泡排序的原理

? ? ? ? ? ?主函數

? ? ? ? ? ?"冒泡排序函數"

? ? ? ? ? ?比較函數

? ? ? ? ? ?交換函數

? ? ? ? ? ?最終輸出

? ? ? ? ? ?完整代碼


冒泡排序的原理:

冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。

以從小到大排序為例,第一趟比較后,所有數中最大的那個數就會浮到最右邊;第二趟比較后,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一趟一趟地比較,最后實現從小到大排序.


主函數:

int main() {?? ?

這里我們創建了一個無規律的數組
?? ?int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };

然后我們把數組的長度計算出來(總字節/單個元素的字節)
?? ?int sz = sizeof(arr) / sizeof(arr[0]);

調用我們自己寫好的"冒泡排序函數"(下面會解釋)
?? ?bubble(arr, sz, sizeof(arr[0]), compare_number);

遍歷交換后的數組
?? ?int i = 0;
?? ?for (i = 0; i < sz; i++) {
?? ??? ?printf("%d ", arr[i]);
?? ?}

}


"冒泡排序函數"

函數的返回值為void,參數是"起始數據地址","總長度","單個數據的字節數","自己定義的比較方法"

void bubble(void* base, int sz , ?int width, int (*cmp)(void* e1, void* e2)) {
?? ?int i = 0;

第一層循環決定交換的趟數
?? ?for (i = 0; i < sz; i++) {
?? ??? ?int j = 0;

定義一個標志量,防止出現排序完成后還繼續交換的情況
?? ?
?? ?int flag = 1;

每一趟進行冒泡排序
?? ??? ?for (j = 0; j < sz - 1-i; j++) {

這里使用了一個自己寫的比較函數,也就是自己想要的排序方法
?? ??? ??? ?if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {

這里是一個交換函數
?? ??? ??? ??? ?Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);

如果交換了就說明還沒有排序完成,繼續下一趟的排序
?? ??? ??? ??? ?flag = 0;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if (flag) {
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}


比較函數:

這里就是簡單的大小比較,第一個數大就返回一個大于0的數

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


交換函數:

運用的就是把每個元素指針指向的元素進行交換

void Swap(char*e1,char*e2,int width) {
?? ?int i = 0;
?? ?for (i = 0; i < width; i++) {
?? ??? ?char temp = *e1;
?? ??? ?*e1 = *e2;
?? ??? ?*e2 = temp;
?? ??? ?e1++;
?? ??? ?e2++;
?? ?}
}


最終輸出:


完整代碼如下:

#include <stdio.h>
//cmp
int compare_number(void* e1, void* e2) {return *(int*)e1 - *(int*)e2;
}
//Swap
void Swap(char*e1,char*e2,int width) {int i = 0;for (i = 0; i < width; i++) {char temp = *e1;*e1 = *e2;*e2 = temp;e1++;e2++;}
}
//冒泡排序  起始地址    數據長度  數據寬度   比較方法函數
void bubble(void* base, int sz ,  int width, int (*cmp)(void* e1, void* e2)) {int i = 0;//第一趟for (i = 0; i < sz; i++) {int j = 0;int flag = 1;for (j = 0; j < sz - 1-i; j++) {if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);flag = 0;}}if (flag) {break;}}
}
int main() {	int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), compare_number);int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}
}

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

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

相關文章

Windows上構建一個和Linux類似的Terminal

preview 目的是在Windows上構建一個和Linux類似的Terminal&#xff0c;讓Windows煉丹和Linux一樣舒適&#xff0c;同是讓Terminal取代Xshell完成遠程鏈接。 預覽如下圖 在Linux下我們使用zsh和oh-my-zsh結合&#xff0c;Windows下我們使用powershell7和oh-my-posh結合。 前提…

Vue 前端開發 v-for和v-if兩個指令不能混合使用

原由&#xff1a; 在進行項目開發的時候因為在一個標簽上同時使用了v-for和v-if兩個指令導致的報錯。 提示錯誤&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

nginx------------緩存功能 ip透傳 負載均衡 (六)

一、http 協議反向代理 &#xff08;一&#xff09;反向代理示例:緩存功能 緩存功能可以加速訪問&#xff0c;如果沒有緩存關閉后端服務器后&#xff0c;圖片將無法訪問&#xff0c;緩存功能默認關閉&#xff0c;需要開啟。 ? proxy_cache zone_name | off; 默認off #指明調…

基于Springboot純凈水配送和商城系統設計與實現 開題報告參考

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

2023 版王道單科書勘誤匯總(3.30)

注:因2023版對題目編號做了優化“歷年真題全部放最后、且按年份排序”&#xff0c;以方便大家根據需要保留某些年份的真題作為最后的模擬。所以造成了一些題目和解析的編號錯誤。 數據結構: P11 P20 P56 P278 P326 “2.”中第 3 行”題 5改成”9”&#xff0c;第6行”題 8”改成…

css3詳解

一.什么是CSS3 CSS3是Cascading Style Sheets的第三個版本&#xff0c;是一種用于描述文檔樣式的語言&#xff08;CSS3是CSS&#xff08;層疊樣式表&#xff09;技術的升級版本&#xff09;。它是前端開發中用于控制網頁布局和樣式的技術之一。CSS3引入了許多新的特性和功能&a…

Linux常用操作命令大全

Linux常用操作命令大全 Linux,作為一款開源的操作系統,深受全世界開發者和系統管理員的喜愛。在Linux環境下,用戶通過命令行界面可以執行各種操作,從而實現對系統的全面控制。本文將詳細介紹Linux中常用的操作命令,幫助讀者更好地理解和運用這些命令。 一、文件操作命令…

hexo圖片顯示不出且圖片路徑錯誤/.com//

參考博客&#xff1a; hexo 圖片顯示問題及使用typora設置圖片路徑-CSDN博客 javascript - hexo 圖片路徑錯誤/.com// - SegmentFault 思否 先說如何讓hexo圖片成功地顯示出來 Step1: 修改config設置 將 _config.yml 設置文件中的 post_asset_folder 修改為 true 這一步的作…

平衡二叉樹,二叉樹的路徑,左葉子之和

第六章 二叉樹part04 今日內容&#xff1a; 110.平衡二叉樹 257. 二叉樹的所有路徑 404.左葉子之和 110.平衡二叉樹 &#xff08;優先掌握遞歸&#xff09; 給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&am…

【不可不知的考研復試秘籍 1】

----------------------------------------------------------------------------------------------------- 考研復試科研背景提升班 教你快速深入了解掌握考研復試面試中的常見問題以及注意事項&#xff0c;系統的教你如何在短期內快速提升自己的專業知識水平和編程以及英語…

windows下安裝cnpm

cnpm是淘寶團隊開發的一個針對中國用戶的npm鏡像源&#xff0c;它是npm的一個定制版本。由于國外的npm源在國內訪問速度較慢&#xff0c;所以cnpm鏡像源可以提供更快的下載速度。cnpm的使用方式與npm基本相同&#xff0c;只需將npm替換為cnpm即可。 要想使用cnpm等先安裝node.…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打開題目 題目源碼&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

每日一題 KY148還是暢通工程

某省調查鄉村交通狀況&#xff0c;得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通&#xff08;但不一定有直接的公路相連&#xff0c;只要能間接通過公路可達即可&#xff09;&#xff0c;并要求鋪設的公路總長度…

PostgreSQL對已有表增加自增序列

對已有表增加自增序列&#xff1a; 1、在PostgreSQL當中&#xff0c;我們要實現對已有表的ID字段自增。 首先需創建一個關聯序列&#xff0c;以下sql語句是創建一個序列&#xff1a; CREATE SEQUENCE menu_id_seq START 6000001; 序列名稱是menu_id_seq&#xff0c;起始…

sizeof 和 strlen的區別

sizeof sizeof是單目操作符,sizeof計算變量所棧內存空間大小,單位是字節,如果操作數是類型的話,會計算類型所占大小,sizeof指在乎占用內存空間大小不在乎內容是什么. int main() {int a 0;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a );printf…

巧【二叉搜索樹的最近公共祖先】【二叉搜索樹的性質】Leetcode 235. 二叉搜索樹的最近公共祖先

【二叉搜索樹的最近公共祖先】【二叉搜索樹性質】Leetcode 235. 二叉搜索樹的最近公共祖先 【巧】解法1 利用二叉搜索樹有序的性質解法2 采用二叉樹求最近公共祖先的方法——后序遍歷 ---------------&#x1f388;&#x1f388;235. 二叉搜索樹的最近公共祖先 題目鏈接&#x…

huggingface上傳或發布自己的模型(大語言模型LLM)

創建huggingface賬號和token 在https://huggingface.co/join注冊huggingface賬號&#xff0c;登錄賬號后&#xff0c;在https://huggingface.co/settings/tokens創建token&#xff0c;注意需要將token的類型設置為WRITE。 安裝必要軟件包和初始化環境 安裝git lfs curl -s …

Springboot+vue的制造裝備物聯及生產管理ERP系統(有報告)。Javaee項目,springboot vue前后端分離項目。

演示視頻&#xff1a; Springbootvue的制造裝備物聯及生產管理ERP系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot vue前后端分離項 項目介紹&#xff1a; 本文設計了一個基于Springbootvue的制造裝備物聯及生產管理ERP系統&#xff0c;采用M&#xff…

WebSocket協議及其在實時通信中的重要性

本文深入介紹了WebSocket協議及其在實時通信中的重要性。從HTTP的限制到WebSocket的優勢&#xff0c;再到連接建立和實際應用&#xff0c;全面闡述了WebSocket的工作原理及其在實際業務中的應用場景。 一、引言 在生產中&#xff0c;有時需要服務端向客戶端發送消息&#xff0…

三元組的最小距離

題目鏈接&#xff1a; 三元組最小距離 定義三元組 $(a, b, c)$&#xff08;$a,b,c$ 均為整數&#xff09;的距離 $D|a-b||b-c||c-a|$。 給定 $3$ 個非空整數集合 $S_1, S_2, S_3$&#xff0c;按升序分別存儲在 $3$ 個數組中。 請設計一個盡可能高效的算法&#xff0c;計算并…