冒泡排序之回調函數!

  前天,鵬哥上課的時候給我們講了回調函數。雖然他噼裏啪啦講了一大堆,然而我還是聽得雲裏霧裏。。(不是我們鵬哥講的不好啦,O(∩_∩)O哈哈~)

  最重要的是 回調函數是什麼,什麼是回調函數。我不知道它是幹什麼的,我當然不會寫他了。所以我就各種百度,谷歌。

接下來,我就用我的話給你們講一下 什麼是回調函數。。。。。


什麼是回調函數(callback)

回調函數是程序上的概念。本質是叫別人做事,自己穿進去額外的信息。

函數A調用函數B

比如A叫B做事,當B在做這件事的時候,自身需要的信息不夠,而A又有。就需要A從外面傳進來,或者B做着做着主動向外面申請。對於B來說,一種被動得到消息,一種主動得到消息。有人給這兩種方式的術語,叫信息的push,和信息的pull。


再舉個生動點的例子。

你有一個任務,但是有一部分你不會做,或者說不願做,所以我來幫你做這部分,你做你其它的任務工作或者等着我的消息,但是當我完成的時候我要通知你我做好了,你可以用了,我怎麼通知你呢?你給我一部手機,讓我做完後給你打電話,我就打給你了,你拿到我的成果加到你的工作中,繼續完成其它的工作.這就叫回叫,手機是我通知你的手段,它就是回叫函數,也叫回調函數.


回調函數的簡單使用

使用冒泡排序可以排字符串,整形


函數如下:


實際中,爲了方便通常會重命名

typedef	 int(*Cmp)(const void *elem1, const void *elem2);

交換函數:

不管是排哪種類型,我們在排序的時候總會把兩個元素交換,所以我們應該先有一個交換函數。

void swap(char *p1, char *p2, int size)//在這以char爲單位,在整形交換和字符串交換的時候就                                       //都可以用了
{
	int i = 0;
	char tmp = 0;
	for (i = 0; i < size; i++)
	{
		tmp = *(p1 + i);
		*(p1 + i) = *(p2 + i);
		*(p2 + i) = tmp;
	}
}

 

比較整數的回調函數:

int compare_int(const void *elem1, const void *elem2)
{
	int a = *(int *)elem1;
	int b = *(int *)elem2;
	return a - b;
}


比較字符串的回調函數:

int compare_str(const void *elem1, const void *elem2)
{
	char a = *(char *)*(int *)elem1;
	char b = *(char *)*(int *)elem2;
	return a - b;
}


冒泡排序:

void bubble_sort(void *arr, int n,int size,Cmp cmp)
{
    assert(arr);
    int i = 0;
    int j = 0;
    for (i = 0; i < n - 1; i++)
    {
      for (j = 0; j < n - 1 - i; j++)
	{
           if (cmp(((char *)arr + j*size), ((char *)arr + (j + 1)*size)) > 0)
	     {
	         swap(((char *)arr + j*size), ((char *)arr + (j + 1)*size), size);
	     }
        }
    }
}


主函數:

int main()
{
	char *str[] = { "bsjdfvgn", "aaaaaa", "fghgjj", "mniig" };
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	int n_int = sizeof(arr) / sizeof(arr[0]);
	int n_str = sizeof(str) / sizeof(str[0]);
	bubble_sort(str, n_str, sizeof(str[0]), compare_str);
	printf("bubble_sort str in:\n");
	for (i = 0; i < n_str; i++)
	{
		printf("%s ", str[i]);
	}
	printf("\n");
	bubble_sort(arr, n_int, sizeof(arr[0]), compare_int);
	printf("bubble_sort int in:\n");
	for (i = 0; i < n_int; i++)
	{
		printf("%d ", arr[i]);
	}
	system("pause");
	return 0;
}


注:主要思想:排序的是什麼元素都將其強制類型轉換成(char*),因爲可以把char當作一個基類。然後再根據排序元素的類型,將其強制類型轉化成目標類型.

例如:

int compare_int(const void *elem1, const void *elem2)
{
	int a = *(int *)elem1;
	int b = *(int *)elem2;
	return a - b;
}

把基類強制類型轉換成int*再*就得到int類型的數據。字符串比較函數也是如此。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章