1. 程式人生 > >回撥函式淺析

回撥函式淺析

回撥函式的使用舉例:

//字元排序

#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;
}