用冒泡排序模擬C語言中的內置快排函數qsort!

目錄

??編輯

1.回調函數的介紹

2. 回調函數實現轉移表

3. 冒泡排序的實現

4. qsort的介紹和使用

5. qsort的模擬實現?

6. 完結散花


?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?悟已往之不諫,知來者猶可追 ?

創作不易,寶子們!如果這篇文章對你們有幫助的話,別忘了給個免費的贊喲~

1.回調函數的介紹

這里首先介紹一下回調函數的概念~

回調函數是使用函數指針(地址)調用的函數。

如果我們把一個函數的指針(地址)作為一個參數傳遞給另一個函數,當我們通過指針找到這個函數并對其進行調用時,這個被調用的函數就是回調函數。

回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應

#include<stdio.h>
test(void (*print)())
{print();
}
void print()
{printf("這是一個回調函數\n");
}
int main()
{test(print);return 0;
}


2. 回調函數實現轉移表

現在我們來實現一個簡單的計算器~

#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
do
{
printf("*************************\n");
printf(" 1:add 2:sub \n");
printf(" 3:mul 4:div \n");
printf(" 0:exit \n");
printf("*************************\n");
printf("請選擇:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("輸?操作數:");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("輸?操作數:");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("輸?操作數:");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("輸?操作數:");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}

我們可以很容易的觀察到上述代碼有一部分是多次重復的~

?這部分只有函數的調用是不一樣的,所以我們是不是可以把這部分封裝成一個函數calc(),在calc函數中調用不同的加減乘除函數就行了呢~

#include <stdio.h>
int add(int a, int b)
{return a + b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
void cacl(int(*p)(int x, int y))
{int x = 0;int y = 0;printf("輸入操作數:");scanf("%d %d", &x, &y);int ret = p(x, y);printf("ret = %d\n", ret);
}int main()
{int input = 1;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf(" 0:exit \n");printf("*************************\n");printf("請選擇:");scanf("%d", &input);switch (input){case 1:cacl(add);break;case 2:cacl(sub);break;case 3:cacl(mul);break;case 4:cacl(div);break;case 0:printf("退出程序\n");break;default:printf("選擇錯誤\n");break;}} while (input);return 0;
}

3. 冒泡排序的實現

常見的排序有插入排序、選擇排序、希爾排序、冒泡排序、快速排序等等~

在講qsort前,這里我們先了解一下冒泡排序~

顧名思義,冒泡排序就是讓元素像泡泡一樣慢慢往上移動~

?這里我用C語言來實現一下~

void bull_sort(int* arr,int len)
{assert(arr);//判斷指針的有效性for (int i = 0; i < len - 1; i++){int flag = 1;//假設已經有序for (int j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;}}if (flag == 1)break;}
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int len = sizeof(arr) / sizeof(arr[0]);bull_sort(arr, len);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}

運行效果~

?

4. qsort的介紹和使用

接下來我們就來看看qsort啦~

注意我們在使用qsort時要引入頭文件#include<stdlib.h>

這里簡單的舉個栗子來使用一下qsort啦~

int cmp_int(const void* a, const void* b)
{assert(a && b);return *(int*)a - *(int*)b;
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int len = sizeof(arr) / sizeof(arr[0]);assert(arr);//判斷指針的有效性qsort(arr, len, sizeof(arr[0]), cmp_int);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;;
}

效果如下~

?我們還可以使用qsort比較結構體類型的變量!

我們通過結構體中的名字來比較結構體變量的大小~

struct S
{char name[20];int age;
};//定義一個結構體類型
int cmp_stu_by_age(const void* a,const void* b)
{return strcmp(((struct S*)a)->name, ((struct S*)b)->name);
}
int main()
{struct S student[3] = { {"zhangsan",18},{"lisi",17},{"wanglaowu",16} };//定義一個結構體數組并初始化int len = sizeof(student) / sizeof(student[0]);qsort(student, len, sizeof(student[0]), cmp_stu_by_age);return 0;
}

排序前~

排序后~

5. qsort的模擬實現?

對比上面我們自己寫的冒泡排序和C語言中的內置快排,我們會發現我們自己寫的冒泡排序只能對int類型的數據進行排序(有局限性),而qsort卻可以對任意類型的數據進行排序。

接下來這里我就使用冒泡排序的算法模擬實現qsort~

int cmp_int(const void* a, const void* b)
{assert(a && b);return *(int*)a - *(int*)b;
}
void swap(char* buf1,char* buf2,size_t num)//一個一個字節交換
{while (num--){char tmp = *(buf1);*(buf1) = *(buf2);*(buf2) = tmp;buf1++;buf2++;}
}
void my_qsort(void* arr, size_t len, size_t num, int (*cmp_int)(const void*,const void*))
{assert(arr);//判斷指針的有效性for (int i = 0; i < len - 1; i++){int flag = 1;//假設已經有序for (int j = 0; j < len - 1 - i; j++){if(cmp_int((char*)arr + j * num, (char*)arr + (j + 1) * num)>0);{swap(((char*)arr + j * num), ((char*)arr + (j + 1) * num),num);flag = 0;}}if (flag == 1)break;}
}
int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };size_t len = sizeof(arr) / sizeof(arr[0]);my_qsort(arr, len, sizeof(arr[0]), cmp_int);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}

運行效果如下~

?

6. 完結散花

好了,這期的分享到這里就結束了~

如果這篇博客對你有幫助的話,可以用你們的小手指點一個免費的贊并收藏起來喲~

如果期待博主下期內容的話,可以點點關注,避免找不到我了呢~

我們下期不見不散~~

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

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

相關文章

機器學習:模型評估和模型保存

一、模型評估 from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 使用測試集進行預測 y_pred model.predict(X_test)# 計算準確率 accuracy accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy*100:.2f}%")# 打印…

整數和浮點數在內存中的存儲(大小端字節序,浮點數的存取)

目錄 1.整數在內存中的存儲 2.大小端字節序和字節序判斷 2.1什么是大小端&#xff1f; 2.2為什么會有大小端 3.浮點數在內存中的存儲 3.1浮點數的存儲 3.1.1 浮點數存的過程 3.1.2 浮點數取的過程 3.2 解析 3.3 驗證浮點數的存儲方式 1.整數在內存中的存儲 整數的二進…

PAT (Basic Level) Practice | 朋友數

如果兩個整數各位數字的和是一樣的&#xff0c;則被稱為是“朋友數”&#xff0c;而那個公共的和就是它們的“朋友證號”。例如 123 和 51 就是朋友數&#xff0c;因為 123 51 6&#xff0c;而 6 就是它們的朋友證號。給定一些整數&#xff0c;要求你統計一下它們中有多少個不…

億道信息輕工業三防EM-T195,零售、制造、倉儲一網打盡

厚度僅10.5mm&#xff0c;重量僅0.65千克的EM-T195&#xff0c;其緊湊而纖薄的設計為以往加固型平板帶來了全新的輕薄概念。盡管設計時尚、輕薄&#xff0c;但經過軍用認證的強固性仍然能夠承受所有具有挑戰性的環境條件。隨身攜帶無負擔的輕便性加上抗震功能使其成為餐廳、酒店…

C++_數據類型_字符型

作用 字符型變量用于顯示單個字符 語法 char ch a;注意 在顯示字符型變量時&#xff0c;用單引號將字符括起來&#xff0c;不要用雙引號單引號只能有一個字符&#xff0c;不可以是字符串 C和C中字符型變量只占用一個字節字符型變量并不是把字符本身放到內存中存儲&#xf…

Excel導出

目錄 Maven依賴 實體類 表頭列寬自適應處理器 行列凍結處理器 合并單元格處理器 工具類 Maven依賴 <!--easy excel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</vers…

數獨游戲(dfs)

代碼注釋如下 #include <iostream> using namespace std; const int N 10; bool col[N][N], rol[N][N], cell[3][3][N]; char g[N][N]; bool dfs(int x, int y) { //用bool這樣在找到一個方案就可以迅速退出if(y 9) x, y 0; //若y超出邊界&#xff0c;則第二…

S1---FPGA硬件板級原理圖實戰導學

視頻鏈接 FPGA板級實戰導學01_嗶哩嗶哩_bilibili FPGA硬件板級原理圖實戰導學 【硬件電路設計的方法和技巧-嗶哩嗶哩】硬件電路設計的方法和技巧01_嗶哩嗶哩_bilibili&#xff08;40min&#xff09; 【高速板級硬件電路設計-嗶哩嗶哩】 高速板級硬件電路設計1_嗶哩嗶哩_bil…

【RT-Thread基礎教程】郵箱的使用

文章目錄 前言一、郵箱的特性二、郵箱操作函數2.1 創建郵箱創建動態郵箱創建靜態郵箱 2.2 刪除郵箱2.3 發郵件2.4 取郵件 三、示例代碼總結 前言 RT-Thread是一個開源的實時嵌入式操作系統&#xff0c;廣泛應用于各種嵌入式系統和物聯網設備。在RT-Thread中&#xff0c;郵箱是…

輸入一個整數,輸出其最長連續因子。

輸入一個整數&#xff0c;輸出其最長連續因子。 例如 輸入&#xff1a;60 輸出&#xff1a;2 3 4 5 6 注意&#xff1a;1不算因子 輸入輸出格式 輸入描述: 輸入一個整數N&#xff0c;N<10000。 輸出描述: 輸出其最長連續因子&#xff0c;如果有多個最長&#xff0c;輸出…

HTML5浮動

1.標準文檔流組成 塊級元素&#xff08;block&#xff09; 內聯元素&#xff08;inline&#xff09; 2.display屬性 作用&#xff1a;指定HTML標簽的顯示方式 常用屬性 值 說明 block 塊級元素的默認值&#xff0c;元素會被顯示為塊級元素&#xff0c;該元素前后會帶有換行…

Linux UnixODBC安裝配置

配置 UnixODBC 夢之上關注IP屬地: 香港 0.2322020.12.09 13:23:10字數 1,202閱讀 5,447 麒麟&達夢適配系列: 1.麒麟服務器上安裝 DM8 2.配置 UnixODBC 3.beego-ORM 適配達夢 資源緊張的時候&#xff0c;服務器是大家共用的&#xff0c;上面部署了一堆服務。所以選用doc…

Lua速成(7)

一、Lua 元表(Metatable) 在 Lua table 中我們可以訪問對應的 key 來得到 value 值&#xff0c;但是卻無法對兩個 table 進行操作(比如相加)。 因此 Lua 提供了元表(Metatable)&#xff0c;允許我們改變 table 的行為&#xff0c;每個行為關聯了對應的元方法。 例如&#xf…

ShardingJdbc實戰-分庫分表

文章目錄 基本配置分庫分表的分片策略一、inline 行表達時分片策略algorithm-expression行表達式完整案例和配置如下 二、根據實時間日期 - 按照標準規則分庫分表標準分片 - Standard完整案例和配置如下 基本配置 邏輯表 邏輯表是指&#xff1a;水平拆分的數據庫或者數據表的相…

SpringBoot實戰(1)

SpringBoot總結 一,Spring 設計思想 OOP: 面向對象編程-》封裝、繼承、多態 BOP: 面向Bean編程-》一切從Bean開始 AOP: 面向切面編程-》解藕、專 人做專事 IOC: 控制反轉,將new 對象的操作交給Spring統一管理-》轉交控制權 DI/DL: 依賴注入/依賴查找-》自動賦值 DI和AOP…

LLVM 一些重要文檔 LLVM 3.0

基于LLVM 3.0: Documentation for the LLVM System at SVN head LLVM 作為庫的使用方法&#xff1a; Using The LLVM Libraries LLVM C 的編程規范&#xff1a; LLVM Coding Standards

stl 迭代器(Iterator)

定義 迭代器&#xff08;Iterator&#xff09;是STL&#xff08;Standard Template Library&#xff0c;標準模板庫&#xff09;中的一個核心概念&#xff0c;用于提供一種通用的方式來遍歷容器&#xff08;如vector、list、map等&#xff09;中的元素&#xff0c;而無需暴露容…

大小端問題

0. 介紹 大小端計算機存儲數據而安排字節的兩種順序。 針對的是字節。 大端與我們平時書寫的順序一致。 1. 大小端的判定 不需要手動判斷。 有一個頭文件endian.h; 可能會有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通過庫來進行判斷。 手動判斷 根據字節存取的順序…

【JSON2WEB】07 Amis可視化設計器CRUD增刪改查

總算到重點中的核心內容&#xff0c;CRUD也就是增刪改查&#xff0c;一個設計科學合理的管理信息系統&#xff0c;95%的就是CRUD&#xff0c;達不到這個比例要重新考慮一下你的數據庫設計了。 1 新增頁面 Step 1 啟動amis-editor Setp 2 新增頁面 名稱和路徑隨便命名&#xf…

Dynamo幕墻探究系列(一)

一直想寫個系列教程&#xff0c;但是沒有那么多時間整理資料&#xff0c;這次呢&#xff0c;先弄個小系列吧&#xff0c;還是和之前差不多的幕墻測試&#xff0c;我們分幾節課&#xff0c;一步一步深入研究。 今天先開個小頭兒&#xff0c;要弄的&#xff0c;就是下面這么個模型…