摘要:參數含義上圖是函數各個參數的含義,讓我們一個個來看。使用方式頭文件要使用函數我們首先需要引用一個頭文件的實現函數給函數規定了特定的參數。因此我們設計函數時要嚴格遵守其參數設定。
目錄
?qsort()函數(quick sort)是八大排序算法中的快速排序,能夠排序任意數據類型的數組其中包括整形,浮點型,字符串甚至還有自定義的結構體類型。
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
?上圖是qsort函數各個參數的含義,讓我們一個個來看。
我們要排序一組數據,首先我們需要找到這組數據在哪,因此我們直接將首元素的地址傳給qsort函數來確定從哪開始排序。
我們知道了從哪開始,也要知道在哪結束才能確定一組需要排序的數據,但是我們不方便直接將結尾元素的地址傳入函數,因此我們將需要排序的元素的個數傳給qsort函數來確定一組數據。
我們知道qsort函數能排序任意數據類型的一組數據,因此我們用void*類型的指針來接收元素,但是我們知道void*類型的指針不能進行加減操作,也就無法移動,那么在函數內部我們究竟用什么類型的指針來操作變量呢?我們可以將void*類型的指針強制類型轉換成char*類型的指針后來操作元素,因為char*類型的指針移動的單位字節長度是1個字節,我們只需要再知道我們需要操作的數據是幾個字節就可以操作指針從一個元素移動到下一個元素,因此我們需要將元素大小傳入qsort函數。
我們需要告訴qsort函數我們希望數據按照怎么的方式進行比較,比如對于幾個字符串,我們可以比較字符串的大小(strcmp),也可以比較字符串的長度(strlen),因此我們要告訴qsort函數我們希望的比較方式,我們就需要傳入一個比較函數compar就簡寫為cmp吧。
?要使用qsort函數我們首先需要引用一個頭文件
#include
qsort函數給cmp函數規定了特定的參數。因此我們設計cmp函數時要嚴格遵守其參數設定。
int compar (const void* e1, const void* e2);
如果你要比較的數據是整形:
int cmp_int(const void* e1, const void* e2){ return *(int*)e1 - *(int*)e2;}
如果你要比較的數據是浮點型:
int cmp_float(const void* e1, const void* e2){ return (int)(*(float*)e1 - *(float*)e2);}
如果你要比較的是字符串的大小:
int cmp_str_size(const void* e1, const void* e2){ return strcmp((char*)e1,(char*)e2);}
如果你要比較的是字符串的長度:
int cmp_str_len(const void* e1, const void* e2){ return strlen((char*)e1)-strlen((char*)e2);}
如果你要比較的數據是結構體變量:
int cmp_by_age(const void*e1, const void*e2){ return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);}
?需要注意的是:返回結果一定要確保是整形,如果不是一定要強制類型轉換成整形!
快速排序結構體變量示例:
#include typedef struct stu{ //char name; int age; float weight; double hight;}stu;int cmp_by_age(const void*e1, const void*e2){ return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);}int main(){ stu class1[3] = { {17,185.5,190.8}, {16,160.9,200.7}, {18,120.3,150.5} }; int sz = sizeof(class1) / sizeof(class1[0]); int i; qsort(class1, sz,sizeof(class1[0]), cmp_by_age); for (i = 0; i < 3; i++) { printf("%.1f/n", class1[i].weight); } return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119809.html
摘要:目錄一函數是什么二使用排序以升序為例關于型指針整形數組排序字符數組排序字符指針數組排序結構體數組排序浮點型數組排序三使用冒泡排序思想模擬實現函數什么是冒泡排序冒泡排序代碼使用冒泡排序思想模 目錄 一.qsort函數是什么 ?二.使用qsort排序-以升序為例 ? ? ??關于void*型指針...
摘要:我們以冒泡排序為例,模擬實現函數。交換每單位字節對于的二進制序列這樣,冒泡排序就能排序多種數據類型,模擬實現了函數,當然也可以使用其他的排序方法模擬實現函數。 ??...
摘要:函數詳解函數原型函數的作用及用法函數的參數函數實例排序一個整型數組排序一個結構體用冒泡排序模擬一個函數函數原型函數的作用及用法函數的功能是對數組進行排序,數組有個元素,每個元素大小為可以排序數字,字符,結構體等多種類型 ...
摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進行指針運算解引用,整數等。求指針所占字節而不是解引用訪問權限大小。數組就是整個數組的大小,數組元素則是數組元素的大小,指針大小都為。 ...
摘要:指針的大小是固定的個字節位平臺位平臺。二指針數組指針數組是一個存放指針的數組。是一個數組指針,該指針指向的數組有個元素,每個元素都是的。錯誤錯誤二維數組首元素指的是第一行。 ...
閱讀 2336·2021-11-24 11:16
閱讀 2022·2021-09-30 09:47
閱讀 1996·2021-09-10 10:51
閱讀 1316·2019-08-30 14:08
閱讀 3133·2019-08-30 13:47
閱讀 1520·2019-08-30 13:02
閱讀 3227·2019-08-29 12:29
閱讀 3178·2019-08-26 17:05