摘要:聲明下面是函數(shù)的聲明。參數(shù)指向要排序的數(shù)組的第一個(gè)元素的指針。數(shù)組中每個(gè)元素的大小,以字節(jié)為單位。返回值該函數(shù)不返回任何值。
下面是 qsort() 函數(shù)的聲明。
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
該函數(shù)不返回任何值。
舉例如下:
#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函數(shù)就是多功能版的冒泡排序,讓我們?cè)诿芭菖判虻幕A(chǔ)上更改;
冒泡排序參數(shù)只需要首地址,元素個(gè)數(shù),qsort函數(shù)的參數(shù)分別要傳首地址,元素個(gè)數(shù),單位字節(jié)數(shù),排序規(guī)則(是個(gè)函數(shù)),相同的是有兩層循環(huán),外層循環(huán)是一共排多少趟,內(nèi)層是一趟排列多少對(duì),在原地址排序不要要返回值;
if (cmp((char*)base + j*width, (char*)base + (j + 1)*width) > 0){ //交換 swap((char*)base + j*width, (char*)base + (j + 1)*width, width);}
?多帶帶解釋一下:想要通用排序函數(shù),參數(shù)的類型不能多帶帶化,所以地址只能用void*來接收;
但是在比較兩數(shù)大小時(shí),要解引用,void型不能解引用。在知道單位字節(jié)的情況下可以強(qiáng)制轉(zhuǎn)化為(char*)加上整數(shù)倍個(gè)單位字節(jié)數(shù),來訪問元素;
當(dāng)內(nèi)部循環(huán) j=0?時(shí),第一個(gè)元素可以表示為(char*)base+j*width
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??第二個(gè)元素可以表示為(char*)base+(j+1)*width
當(dāng) 前者 大于 后者 時(shí)要進(jìn)行交換,交換函數(shù)與冒泡函數(shù)有所不同;
最后一點(diǎn):規(guī)則排序函數(shù)
排列int型,上面有
再舉一個(gè)例子,排列結(jié)構(gòu)體類型;
int cmp_stu(const void* e1, const void* e2){ return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name); //先強(qiáng)制轉(zhuǎn)化為結(jié)構(gòu)體類型,再解引用;}struct stu{ char name[20]; int age;};struct stu s[3] = { { "zhangsan", 20 }, { "lisi", 15 }, { "wangwu", 30 } };
當(dāng)前者大于后者將返回一個(gè)正數(shù),與上面判斷大于0時(shí)交換數(shù)據(jù)相呼應(yīng);?
排列整形源代碼如下:
#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*)){ //趟數(shù); for (int i = 0; i < num; i++) { //比較對(duì)數(shù); 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");}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119013.html
摘要:函數(shù)詳解函數(shù)原型函數(shù)的作用及用法函數(shù)的參數(shù)函數(shù)實(shí)例排序一個(gè)整型數(shù)組排序一個(gè)結(jié)構(gòu)體用冒泡排序模擬一個(gè)函數(shù)函數(shù)原型函數(shù)的作用及用法函數(shù)的功能是對(duì)數(shù)組進(jìn)行排序,數(shù)組有個(gè)元素,每個(gè)元素大小為可以排序數(shù)字,字符,結(jié)構(gòu)體等多種類型 ...
摘要:讓我們來看一下代碼,首先我們還是冒泡排序一樣,進(jìn)行了兩次循環(huán),第一次代表排序趟數(shù),第二次代表每趟的排序次數(shù)。這塊的詳細(xì)介紹在本篇文章稍前的冒泡排序中也有詳細(xì)介紹。 ...
摘要:回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。 目錄 前言無類型指針結(jié)構(gòu)體指針枚舉變量指針函數(shù)...
摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進(jìn)行指針運(yùn)算解引用,整數(shù)等。求指針?biāo)甲止?jié)而不是解引用訪問權(quán)限大小。數(shù)組就是整個(gè)數(shù)組的大小,數(shù)組元素則是數(shù)組元素的大小,指針大小都為。 ...
閱讀 3164·2021-11-19 09:40
閱讀 1590·2021-11-15 11:39
閱讀 704·2021-10-08 10:05
閱讀 2305·2021-09-03 10:29
閱讀 3437·2021-08-12 13:22
閱讀 2238·2019-08-30 15:54
閱讀 3745·2019-08-30 14:03
閱讀 2673·2019-08-30 13:45