成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

c學(xué)習(xí)筆記——自定義qsort函數(shù)

yanest / 2875人閱讀

摘要:一前言我們學(xué)習(xí)過的冒泡排序,插入排序,選擇排序等經(jīng)典排序方法,為我們數(shù)據(jù)排序提供了穩(wěn)定思路,但局限在于排序數(shù)據(jù)類型的單一。

一、前言

? ?我們學(xué)習(xí)過的冒泡排序,插入排序,選擇排序等經(jīng)典排序方法,為我們數(shù)據(jù)排序提供了穩(wěn)定思路,但局限在于排序數(shù)據(jù)類型的單一。為了解決這一問題,c語言中提供了庫函數(shù)qsort解決。我們今天就通過自定義函數(shù)實(shí)現(xiàn)qsort的功能,排序方法采用基本的冒泡排序


?二、從MSDN認(rèn)識qsort

1.分析:

我們需要傳入四個變量:base——待排序數(shù)組的首元素地址;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? num——數(shù)組內(nèi)的元素個數(shù);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? width——每個元素的大?。▎挝粸樽止?jié));

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?函數(shù)指針——傳入兩個數(shù)的地址,比較二者大?。ㄐ枳约涸O(shè)計(jì))

2.void*的特殊性

1.可以傳入任何類型的指針而不會報(bào)警告,適合我們實(shí)現(xiàn)任何數(shù)據(jù)類型排序的目的;

2.不可以對其進(jìn)行解引用操作,除非通過強(qiáng)制類型轉(zhuǎn)換()確定其具體類型;

3.不可以對其進(jìn)行加減運(yùn)算,原因是不知道類型所以不知道步長,因此還是需要強(qiáng)制類型轉(zhuǎn)換


三、cmp_函數(shù)的實(shí)現(xiàn)

注意:都需要先進(jìn)行強(qiáng)制類型轉(zhuǎn)換才可以解引用

1.比較int類型數(shù)據(jù)

int cmp_int(const void* e1, const void* e2){	return *(int*)e1 - *(int*)e2;}

2.比較char類型數(shù)據(jù)

char類型數(shù)據(jù)不可以用<>=進(jìn)行比較,所以要用函數(shù)strcmp庫函數(shù),頭文件為#include

int cmp_char(const void*e1, const void*e2){	return strcmp((char*)e1, (char*)e2);}

3.比較float類型函數(shù)

因?yàn)榉祷氐氖莍nt類型,所以我們加入了判斷語句。用數(shù)的正負(fù)表示數(shù)的大小情況

int cmp_float(const void*e1, const void*e2){	if ((float*)e1 > (float*)e2)		return 1;	else if ((float*)e1 ==(float*)e2)		return 0;	else		return -1;}

4.比較結(jié)構(gòu)體類型函數(shù)

結(jié)構(gòu)體數(shù)組元素不可以直接比較,必須先選出結(jié)構(gòu)體某一內(nèi)容進(jìn)行比較

typedef struct book{ 	char name[20];	int prince;                   }b;//重命名struct book為bint cmp_stru_price(const void*e1, const void*e2){	return ((b*)e1)->prince - ((b*)e2)->prince;}

注意?。。。╞*)e1外面的括號不可以省略,因?yàn)?>的優(yōu)先級比強(qiáng)制類型轉(zhuǎn)換高


四、bubble_sort函數(shù)的實(shí)現(xiàn)

首先思考一個問題:既然傳入的指針為void*類型,如何實(shí)現(xiàn)步長的確定?聰明的科學(xué)家想到利用width作為我們的標(biāo)準(zhǔn)

void bubble_sort(void*base,int sz,int width,int(*cmp)(void*,void*)){	int i; int j;	for (i = 0; i < sz - 1; i++)	{		for (j = 0; j < sz - 1-i; j++)		{			if (cmp((char*)base + width*j, (char*)base + width*(j + 1))>0)			{				swap((char*)base + width*j, (char*)base + width*(j + 1),width);			}		}	}}

分析:

1.int(*)(void*,void*)是一個函數(shù)指針,指向我們之前設(shè)計(jì)的大小比較函數(shù)

2.在使用base的時候要先強(qiáng)制類型轉(zhuǎn)換才可以作加減運(yùn)算

3.漂亮的地方在于,不管實(shí)際傳入的base是什么類型,我們都將其轉(zhuǎn)化為char*類型的指針,因?yàn)閏har*的步長最小為1,加上width就可以準(zhǔn)確指向下一個?

以int為例,width為4,所及就可以指向下一個元素

?

?


五、swap函數(shù)的實(shí)現(xiàn)

void swap(char*buff1,char*buff2,int width){	int i;	for (i = 0; i < width; i++)	{		int tmp = *buff1;		*buff1 = *buff2;		*buff2 = tmp;		buff1++;		buff2++;	}}

值得關(guān)注的是,交換不是一次就可以了,因?yàn)槲覀儸F(xiàn)在是char*類型的指針,如上圖所畫,一次只能交換一格,如交換int的,要交換4次


六、重難點(diǎn)總結(jié)

1.函數(shù)指針的使用,使我們每次只需導(dǎo)入大小比較函數(shù)的地址即可,而不必寫多個函數(shù),分別含有不同的大小比較函數(shù),減少了重復(fù)代碼的出現(xiàn)

?2.width的使用相當(dāng)于告訴了我們進(jìn)行比較的數(shù)組元素的類型,滿足我們實(shí)現(xiàn)各種數(shù)據(jù)類型排序的需求

3.void*函數(shù)海納百川,方便了我們的輸入,只是注意在使用時的強(qiáng)制類型轉(zhuǎn)化,否則無法使用


希望上述的總結(jié)對大家的理解有幫助,也更好的欣賞回調(diào)函數(shù)(這里為用函數(shù)指針調(diào)用函數(shù))的魅力。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/118801.html

相關(guān)文章

  • C語言進(jìn)階:指針進(jìn)階續(xù)

    摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進(jìn)行指針運(yùn)算解引用,整數(shù)等。求指針?biāo)甲止?jié)而不是解引用訪問權(quán)限大小。數(shù)組就是整個數(shù)組的大小,數(shù)組元素則是數(shù)組元素的大小,指針大小都為。 ...

    ingood 評論0 收藏0
  • C語言qsort()函數(shù)的使用(詳解)

    摘要:參數(shù)含義上圖是函數(shù)各個參數(shù)的含義,讓我們一個個來看。使用方式頭文件要使用函數(shù)我們首先需要引用一個頭文件的實(shí)現(xiàn)函數(shù)給函數(shù)規(guī)定了特定的參數(shù)。因此我們設(shè)計(jì)函數(shù)時要嚴(yán)格遵守其參數(shù)設(shè)定。 目錄 1.參數(shù)含義 1.首元素地址base 2.元素個數(shù)num 3.元素大小size 4.自定義比較函數(shù)compa...

    wangym 評論0 收藏0
  • C | 指針的相關(guān)知識(二)

    摘要:回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。 目錄 前言無類型指針結(jié)構(gòu)體指針枚舉變量指針函數(shù)...

    alin 評論0 收藏0
  • 使用回調(diào)函數(shù)通過冒泡排序模擬實(shí)現(xiàn)qsort函數(shù)

    摘要:如果你把函數(shù)的指針地址作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。 ...

    MasonEast 評論0 收藏0

發(fā)表評論

0條評論

yanest

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<