qsort函式解析
阿新 • • 發佈:2018-11-10
qsort函式是一種回撥函式,是基於快速排序的演算法,可以實現排序。
這裡先看一下qsort函式的引數
void qsort(void* base, size_t num, size_t size,int(*compar)(const void*, const void*));
第一個引數是傳要排列的陣列;
第二個引數是陣列中元素的個數;
第三個是陣列中每個元素的長度;
最後一個引數是一個函式指標,指向一個比較函式。
說明:函式名和&函式名都是指向函式的地址,所以在qsort函式中,最後一個引數可以是比較函式名,也可以是&函式名。
在程式碼中我使用的是&函式名。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //CmpInt 是 qsort 的比較函式 //呼叫時機不是由程式設計師自己決定的 //而是由 qsort 內部來決定的 //像這種風格的函式就叫“回撥函式” int CmpInt(void* p1, void* p2) { int* a = (int*)p1; int* b = (int*)p2; //如果*a < *b,函式返回真,否則返回假。 //p1和p2,如果希望p2指向的元素在p1的前面,返回真。 return *a < *b; } int main() { int arr[] = { 9, 5, 2, 7 }; int sz = sizeof(arr) / sizeof(arr[0]); //qsort是基於快速排序的演算法 //void qsort(void* base, size_t num, size_t size,int(*compar)(const void*, const void*)); qsort(arr, sz, sizeof(arr[0]), &CmpInt); for (int i = 0; i < sz; i++) { printf("%d\n", arr[i]); } system("pause"); return 0; }
這裡實現的是一個升序,如果想要實現降序,只需把比較函式中的return 改為*a > *b即可。