摘要:聲明下面是函數的聲明。參數指向要排序的數組的第一個元素的指針。數組中每個元素的大小,以字節為單位。返回值該函數不返回任何值。
下面是 qsort() 函數的聲明。
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
該函數不返回任何值。
舉例如下:
#include #include int cmp (const void * a, const void * b){ return ( *(int*)a - *(int*)b );}int main(){ int values[] = { 88, 56, 100, 2, 25 }; int sz=sizeof(values)/sizeof(values[0]); qsort(values, sz, sizeof(values[0]), cmp); printf("/n排序之后的列表:/n"); for( n = 0 ; n < sz; n++ ) { printf("%d ", values[n]); } return(0);}
?qsort函數就是多功能版的冒泡排序,讓我們在冒泡排序的基礎上更改;
冒泡排序參數只需要首地址,元素個數,qsort函數的參數分別要傳首地址,元素個數,單位字節數,排序規則(是個函數),相同的是有兩層循環,外層循環是一共排多少趟,內層是一趟排列多少對,在原地址排序不要要返回值;
if (cmp((char*)base + j*width, (char*)base + (j + 1)*width) > 0){ //交換 swap((char*)base + j*width, (char*)base + (j + 1)*width, width);}
?多帶帶解釋一下:想要通用排序函數,參數的類型不能多帶帶化,所以地址只能用void*來接收;
但是在比較兩數大小時,要解引用,void型不能解引用。在知道單位字節的情況下可以強制轉化為(char*)加上整數倍個單位字節數,來訪問元素;
當內部循環 j=0?時,第一個元素可以表示為(char*)base+j*width
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??第二個元素可以表示為(char*)base+(j+1)*width
當 前者 大于 后者 時要進行交換,交換函數與冒泡函數有所不同;
最后一點:規則排序函數
排列int型,上面有
再舉一個例子,排列結構體類型;
int cmp_stu(const void* e1, const void* e2){ return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name); //先強制轉化為結構體類型,再解引用;}struct stu{ char name[20]; int age;};struct stu s[3] = { { "zhangsan", 20 }, { "lisi", 15 }, { "wangwu", 30 } };
當前者大于后者將返回一個正數,與上面判斷大于0時交換數據相呼應;?
排列整形源代碼如下:
#include int cmp_int(const void* e1, const void* e2){ return *(int*)e1 - *(int*)e2;}void swap(char* buf1, char*buf2, int width){ for (int i = 0; i < width; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; }}void my_qsort(void* base, size_t num, size_t width, int(*cmp)(const void*, const void*)){ //趟數; for (int i = 0; i < num; i++) { //比較對數; for (int j = 0; j < num - 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); } } }}int main(){ int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; int sz = sizeof(arr) / sizeof(arr[0]); my_qsort(arr, sz, sizeof(arr[0]), cmp_int); for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("/n");}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119013.html
摘要:函數詳解函數原型函數的作用及用法函數的參數函數實例排序一個整型數組排序一個結構體用冒泡排序模擬一個函數函數原型函數的作用及用法函數的功能是對數組進行排序,數組有個元素,每個元素大小為可以排序數字,字符,結構體等多種類型 ...
摘要:回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。 目錄 前言無類型指針結構體指針枚舉變量指針函數...
摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進行指針運算解引用,整數等。求指針所占字節而不是解引用訪問權限大小。數組就是整個數組的大小,數組元素則是數組元素的大小,指針大小都為。 ...
閱讀 3074·2021-11-19 09:40
閱讀 1559·2021-11-15 11:39
閱讀 661·2021-10-08 10:05
閱讀 2273·2021-09-03 10:29
閱讀 3406·2021-08-12 13:22
閱讀 2151·2019-08-30 15:54
閱讀 3706·2019-08-30 14:03
閱讀 2654·2019-08-30 13:45