對任意類型數都可以排序的函數:qsort函數

之前我們學習過冒泡排序:

int main()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr)/sizeof(arr[0]);int i = 0;for (i = 0; i < sz-1; i++) {int j = 0;for (j = 0; j < sz-1-i; j++) {if (arr[j] > arr[j + 1]){int temp = 0;temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}for (i = 0; i < sz; i++){printf("%d", arr[i]);}return 0;
}

可以看出這樣的排序方法只適用于整形類型的數
那么是否有一種排序可以滿足所有類型都適用的排序呢?

qsort函數排序
在這里插入圖片描述
應用:
在這里需要補充一下void* 類型的指針
在這里插入圖片描述

void in_mp(const void* p1, const void* p2)
{return(*(int*) p1 - *(int*)p2);
}
void print(int arr[], int sz)
{int i = 0; for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
void test1()
{int arr[] = { 9,6,7,8,5,3,4,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), in_mp);print(arr ,sz);
}
int main()
{test1();return 0;}

在這里插入圖片描述
當然qsort函數排序既然可以實現任意類型,那么我們換幾個類型試一下;
結構體類型

struct stu
{char name[20];int age;
};
void com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ",arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

在這里插入圖片描述
用冒泡排序的思想實現一個功能類似于qsort函數的排序
首先我們先講一下qsort函數的原理
在這里插入圖片描述
然后我們用冒泡排序的思想來改造

所以我們要自己創造一個qsort排序函數就要自己寫一個可以排序任意類型數據的函數
我們用冒泡排序的思想來改造,就要解決一下問題

問題一
在這里插入圖片描述
解決后:
在這里插入圖片描述

問題2
在這里插入圖片描述
解決:
在這里插入圖片描述
代碼:

//測試整形類型的的排序
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
int in_mp(const void* p1, const void* p2)
{return(*(int*)p1 - *(int*)p2);}
tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的兩個對數傳給In_mp函數如果大于0,升序的話就要交換if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交換tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}
void test1()
{int arr[] = { 9,7,8,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr,sz,sizeof(arr[0]),in_mp);print(arr, sz);
}
int main()
{test1();return 0;
}

也可以測試結構體類型

tmp(char* put1, char* put2, int size)
{int i = 0;int temp = 0;for (i = 0; i < size; i++){temp = *put1;*put1 = *put2;*put2 = temp;put1++;put2++;}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - 1 - i; j++){//把每一趟的兩個對數傳給In_mp函數如果大于0,升序的話就要交換if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0) {//交換tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);}}}
}//void test1()
//{
//	int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
//	print(arr, sz);
//}
struct stu
{char name[20];int age;
};int com_in(const void* p1, const void* p2)
{return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%s %d ", arr[i].name, arr[i].age);}
}
void test2()
{struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };int sz = sizeof(arr) / sizeof(arr[0]);bobble_sort(arr, sz, sizeof(arr[0]), com_in);print(arr, sz);
}
int main()
{test2();return 0;
}

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

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

相關文章

接口測試及接口抓包常用的測試工具

接口 接口測試是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換&#xff0c;傳遞和控制管理過程&#xff0c;以及系統間的相互邏輯依賴關系等。 接口測試的重要性 是節省時間前后端不…

七、dokcer-compose部署springboot的jar

1、準備 打包后包名為 ruoyi-admin.jar 增加接口 httpL//{ip}:{port}/common/test/han #環境變量預application.yml 中REDIS_HOSTt的值&#xff0c;去環境變量去找&#xff1b;如果找不到REDIS_HOST就用myredis 1、Dockerfile FROM hlw/java:8-jreRUN ln -sf /usr/share/z…

私密相冊管家-加密碼保護私人相冊照片安全

App Store史上最安全、最強大、最卓越的私密相冊App&#xff01;再也不用擔心私密照片視頻被別人看見了&#xff01;?私密相冊為你提供多重密碼保護機制、簡單便捷的照片存儲空間&#xff0c;完美地將你的私密照片遠離一切惡意偷窺者的窺探&#xff01; 【產品功能】? √ 支…

Redis—持久化

這里寫目錄標題 AOF三種寫回策略寫回策略的優缺點AOF 重寫機制AOF后臺重寫AOF優缺點使用命令 RDBRDB 持久化的工作原理執行快照時&#xff0c;數據能被修改嗎RDB 持久化的優點RDB 持久化的缺點 混合持久化大key對持久化的影響 AOF 保存寫操作命令到日志的持久化方式&#xff0…

開源數據庫Mysql_DBA運維實戰 (DML/DQL語句)

DML/DQL DML INSERT 實現數據的 插入 實例&#xff1a; DELETE 實現數據的 刪除 實例&#xff1a; UPDATE 實現數據的 更新 實例1&#xff1a; 實例2&#xff1a; 實例3&#xff1a; DQL DML/DQL DML語句 數據庫操縱語言&#xff1a; 插入數據INSERT、刪除數據DELE…

2023年即將推出的CSS特性對你影響大不大?

Google開發者大會每年都會提出有關于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了許多新功能&#xff0c;今天就從中找出了影響最大的幾個功能給大家介紹一下 :has :has() 可以通過檢查父元素是否包含特定子元素或這些子元素是否處于特定狀態來改變樣式&#xff0c;也…

Python|OpenCV-繪制圖形和添加文字的方法(2)

前言 本文是該專欄的第2篇,后面將持續分享OpenCV計算機視覺的干貨知識,記得關注。 OpenCV作為一個強大的計算機視覺功能庫,除了能解決圖像處理和計算機視覺任務之外,它還有著非常豐富的圖像繪制功能。可以說,不論是在計算機視覺任務中標記目標領域,還是在圖像上繪制一些…

二刷LeetCode--155. 最小棧(C++版本),思維題

思路:本題需要使用兩個棧,一個就是正常棧,執行出入操作,另一個棧只負責將對應的最小值進行保存即可.每次入棧的時候,最小值棧的棧頂也需要入棧元素,不過這個元素是最小值,那么就需要進行比較,因此在getmin()的時候只需要將最小值棧的棧頂元素彈出即可.初始化的時候只需要將最小…

【vue3】點擊按鈕彈出卡片,點擊卡片中的取消按鈕取消彈出的卡片(附代碼)

實現思路&#xff1a; 在按鈕上綁定一個點擊事件&#xff0c;默認是true&#xff1b;在export default { }中注冊變量給卡片標簽用v-if判斷是否要顯示卡片&#xff0c;ture則顯示&#xff1b;在卡片里面寫好你想要展示的數據&#xff1b;給卡片添加一個取消按鈕&#xff0c;綁…

JVM G1垃圾回收機制介紹

G1(Garbage First)收集器 (標記-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一個新收集器&#xff0c;G1收集器基于“標記-整理”算法實現&#xff0c;也就是說不會產生內存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一個重要特點是&…

vue中 contenteditable 中如何將光標聚焦到最后位置

場景: 1. 在vue中, 又在for循環中, 給div元素配置contenteditable屬性, 但是使用不了v-model綁定 2. 點擊外部元素需要聚焦并將光標聚焦到最后位置 方案: 1. 使用vue-input-contenteditable第三方包, 可以使用v-model綁定, // 下載 yarn add vue-input-contenteditable…

每日一學——網絡層

網絡層是計算機網絡體系結構中的一個關鍵層級。它負責將數據從源主機發送到目標主機&#xff0c;通過路由選擇和路徑管理實現在不同網絡之間的數據傳輸。以下是網絡層的詳細資料&#xff0c;包括應用、案例和常見問題&#xff1a; 功能&#xff1a;網絡層的主要功能是提供端到端…

[Poetize6] IncDec Sequence

題目描述 給定一個長度為 n 的數列 a_1,a_2,...,a_n&#xff0c;每次可以選擇一個區間[l,r]&#xff0c;使這個區間內的數都加 1 或者都減 1。 請問至少需要多少次操作才能使數列中的所有數都一樣&#xff0c;并求出在保證最少次數的前提下&#xff0c;最終得到的數列有多…

django部署到centos服務器上

具體的操作步驟 步驟一 更新系統和安裝依賴&#xff0c; sudo yum update sudo yum install python3 python3-pip python3-devel git步驟二&#xff1a;創建并激活虛擬環境 在終端中執行以下命令&#xff1a; python3 -m venv myenv source myenv/bin/activate可以不創建虛擬…

Python 基礎教程,Python 是什么?

Python 的誕生是極具戲曲性的&#xff0c;據 Guido 自述記載&#xff0c;Python 語言是在圣誕節期間為了打發無聊的時間而開發的&#xff0c;之所以會選擇 Python 作為該編程語言的名字&#xff0c;是因為 Guido 是 Monty Python 戲劇團的忠實粉絲。 Python 語言是在 ABC 語言的…

深度學習的“前世今生”

1、“感知機”的誕生 20世紀50年代&#xff0c;人工智能派生出了這樣兩個學派&#xff0c;分別是“符號學派”及“連接學派”。前者的領軍學者有Marvin Minsky及John McCarthy&#xff0c;后者則是由Frank Rosenblatt所領導。 符號學派的人相信對機器從頭編程&#xff0c;一個…

JavaScript基礎:學習JavaScript語言的基本語法和常用操作,了解網頁交互的基本原理

JavaScript是一種廣泛應用于網頁開發中的腳本語言&#xff0c;它可以與HTML和CSS一起使用&#xff0c;實現網頁交互及動態效果。 以下是JavaScript的基本語法和常用操作&#xff1a; 變量聲明&#xff1a;使用var、let或const關鍵字聲明變量。 var name "John";let …

bug的生命周期

bug的生命周期 bugbug的生命周期bug等級 bug 當且僅當規格說明書是存在的并且正確的&#xff0c;程序和規格說明書之間的不匹配才是錯誤當產品規格說明書沒有提到時&#xff0c;以用戶需求為準&#xff0c;當程序最終沒有實現用戶的合理預期的功能要求時&#xff0c;就是軟件錯…

Sencha Ext.NET Crack,構建Blazing快速應用

Sencha Ext.NET Crack,構建Blazing快速應用 Sencha Ext.NET是一個高級的ASP.NET核心組件框架&#xff0c;它包含了強大的跨瀏覽器Sencha Ext JS庫。通過140多個預構建和專業測試的UI組件實現企業級性能和生產效率。Sencha Ext.NET使用尖端的Web技術創建功能強大的Web應用程序&a…

Hlang社區項目說明

文章目錄 前言Hlang社區技術前端后端 前言 Hello,歡迎來到本專欄&#xff0c;那么這也是第一次做這種類型的專欄&#xff0c;如有不做多多指教。那么在這里我要隆重介紹的就是這個Hlang這個項目。 首先&#xff0c;這里我要說明的是&#xff0c;我們的這個項目其實是分為兩個…