回撥函式淺析
阿新 • • 發佈:2018-11-30
回撥函式的使用舉例:
//字元排序
#include <stdio.h> #include <windows.h> #include <stdlib.h> int char_cmp(const void *p1, const void *p2) { return (*(char *)p1 > *(char *)p2); } int main() { char arr[] = { 'a', 'd', 'c', 'b' }; qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(char), char_cmp); int i = 0; for (; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%c\n", arr[i]); } system("pause"); return 0; }
//整型數字排序
#include <stdio.h> #include <windows.h> #include <stdlib.h> int int_cmp(const void *p1, const void *p2) { return (*(int *)p1 > *(int *)p2); } int main() { int arr[] = { 1, 2, 3, 6, 5, 4 }; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); int i = 0; for (; i < sizeof(arr) / sizeof(arr[0]); i++) { printf("%d\n", arr[i]); } system("pause"); return 0; }
通過比較,我們發現每次比較不同的型別,我們只需寫一個相應型別的比較大小方法(即寫一個回撥函式)即可,剩下的都交給庫函式幫我們完成,那麼現在我們來一起探究一下qsort庫函式的實現原理,模擬該函式的實現吧~~~~
看上圖,我們就可以知道:整體排序思路是利用氣泡排序的思想來進行,cmp函式每次需要比較的位元組數,由我們自己在 (型別)_cmp 函式中定義,而_swap函式裡面是定死的:每次交換一個位元組,迴圈次數是陣列的每個元素的位元組數大小。
下面讓我們一起來實現一下整型數字的qsort模擬排序
程式碼
#include <stdio.h>
#include <windows.h>
int int_cmp(const void *p1, const void *p2)
{
return (*(int *)p1 > *(int *)p2);
}
void _swap(void *p1, void *p2, int size)
{
char *p11 = (char *)p1;
char *p22 = (char *)p2;
int i = 0;
for (; i < size; i++)
{
int tmp = *(p11+i);
*(p11 + i) = *(p22 + i);
*(p22 + i) = tmp;
}
}
void my_qsort(void *arr, int count, int size, int(*cmp)(void *, void *))
{
char *p = (char *)arr;//強轉為字元指標(意思是每次以一個位元組為單位進行操作)
int i = 0;
for (; i < count - 1; i++)
{
int j = 0;
for (; j < count - 1 - i; j++)
{
if (cmp(p + j*size, p + (j+1)*size) > 0)
{
_swap(p + j*size, p + (j + 1)*size, size);
}
}
}
}
int main()
{
int arr[] = { 1, 2, 3, 6, 5, 4 };
my_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
int i = 0;
for (; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
下面讓我們一起來實現一下字元的qsort模擬排序程式碼
#include <stdio.h>
#include <windows.h>
int char_cmp(const void *p1, const void *p2)
{
return (*(char *)p1 > *(char *)p2);
}
void _swap(void *p1, void *p2, int size)
{
char *p11 = (char *)p1;
char *p22 = (char *)p2;
int i = 0;
for (; i < size; i++)
{
int tmp = *(p11 + i);
*(p11 + i) = *(p22 + i);
*(p22 + i) = tmp;
}
}
void my_qsort(void *arr, int count, int size, int(*cmp)(void *, void *))
{
char *p = (char *)arr;//強轉為字元指標(意思是每次以一個位元組為單位進行操作)
int i = 0;
for (; i < count - 1; i++)
{
int j = 0;
for (; j < count - 1 - i; j++)
{
if (cmp(p + j*size, p + (j + 1)*size) > 0)
{
_swap(p + j*size, p + (j + 1)*size, size);
}
}
}
}
int main()
{
char arr[] = { 'a', 'c', 'b', 'g', 'e', 'f', 'd'};
my_qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(char), char_cmp);
int i = 0;
for (; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%c ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}