成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

qsort函數(shù)用法以及如何自己實(shí)現(xiàn)

jerry / 2304人閱讀

摘要:聲明下面是函數(shù)的聲明。參數(shù)指向要排序的數(shù)組的第一個(gè)元素的指針。數(shù)組中每個(gè)元素的大小,以字節(jié)為單位。返回值該函數(shù)不返回任何值。

聲明

下面是 qsort() 函數(shù)的聲明。

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))

參數(shù)

  • base?-- 指向要排序的數(shù)組的第一個(gè)元素的指針。
  • nitems?-- 由 base 指向的數(shù)組中元素的個(gè)數(shù)。
  • size?-- 數(shù)組中每個(gè)元素的大小,以字節(jié)為單位。
  • compar?-- 用來比較兩個(gè)元素的函數(shù)。

返回值

該函數(shù)不返回任何值。

舉例如下:

#include #include int cmp (const void * a, const void * b){   return ( *(int*)a - *(int*)b );}int main(){   int values[] = { 88, 56, 100, 2, 25 };   int sz=sizeof(values)/sizeof(values[0]);   qsort(values, sz, sizeof(values[0]), cmp);   printf("/n排序之后的列表:/n");   for( n = 0 ; n < sz; n++ ) {      printf("%d ", values[n]);   }   return(0);}

?qsort函數(shù)就是多功能版的冒泡排序,讓我們?cè)诿芭菖判虻幕A(chǔ)上更改;

冒泡排序參數(shù)只需要首地址,元素個(gè)數(shù),qsort函數(shù)的參數(shù)分別要傳首地址,元素個(gè)數(shù),單位字節(jié)數(shù),排序規(guī)則(是個(gè)函數(shù)),相同的是有兩層循環(huán),外層循環(huán)是一共排多少趟,內(nèi)層是一趟排列多少對(duì),在原地址排序不要要返回值;

if (cmp((char*)base + j*width, (char*)base + (j + 1)*width) > 0){    //交換	swap((char*)base + j*width, (char*)base + (j + 1)*width, width);}

?多帶帶解釋一下:想要通用排序函數(shù),參數(shù)的類型不能多帶帶化,所以地址只能用void*來接收;

但是在比較兩數(shù)大小時(shí),要解引用,void型不能解引用。在知道單位字節(jié)的情況下可以強(qiáng)制轉(zhuǎn)化為(char*)加上整數(shù)倍個(gè)單位字節(jié)數(shù),來訪問元素;

當(dāng)內(nèi)部循環(huán) j=0?時(shí),第一個(gè)元素可以表示為(char*)base+j*width

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??第二個(gè)元素可以表示為(char*)base+(j+1)*width

當(dāng) 前者 大于 后者 時(shí)要進(jìn)行交換,交換函數(shù)與冒泡函數(shù)有所不同;

最后一點(diǎn):規(guī)則排序函數(shù)

排列int型,上面有

再舉一個(gè)例子,排列結(jié)構(gòu)體類型;

int cmp_stu(const void* e1, const void* e2){	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);    //先強(qiáng)制轉(zhuǎn)化為結(jié)構(gòu)體類型,再解引用;}struct stu{	char name[20];	int age;};struct stu s[3] = { { "zhangsan", 20 }, { "lisi", 15 }, { "wangwu", 30 } };

當(dāng)前者大于后者將返回一個(gè)正數(shù),與上面判斷大于0時(shí)交換數(shù)據(jù)相呼應(yīng);?

排列整形源代碼如下:

#include int cmp_int(const void* e1, const void* e2){	return *(int*)e1 - *(int*)e2;}void swap(char* buf1, char*buf2, int width){	for (int i = 0; i < width; i++)	{		char tmp = *buf1;		*buf1 = *buf2;		*buf2 = tmp;		buf1++;		buf2++;	}}void my_qsort(void* base, size_t num, size_t width, int(*cmp)(const void*, const void*)){	//趟數(shù);	for (int i = 0; i < num; i++)	{		//比較對(duì)數(shù);		for (int j = 0; j < num - 1 - i; j++)		{			if (cmp((char*)base + j*width, (char*)base + (j + 1)*width) > 0)			{				//交換;				swap((char*)base + j*width, (char*)base + (j + 1)*width,width);			}		}	}}int main(){	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };	int sz = sizeof(arr) / sizeof(arr[0]);	my_qsort(arr, sz, sizeof(arr[0]), cmp_int);	for (int i = 0; i < sz; i++)	{		printf("%d ", arr[i]);	}	printf("/n");}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119013.html

相關(guān)文章

  • qsort()函數(shù)詳解

    摘要:函數(shù)詳解函數(shù)原型函數(shù)的作用及用法函數(shù)的參數(shù)函數(shù)實(shí)例排序一個(gè)整型數(shù)組排序一個(gè)結(jié)構(gòu)體用冒泡排序模擬一個(gè)函數(shù)函數(shù)原型函數(shù)的作用及用法函數(shù)的功能是對(duì)數(shù)組進(jìn)行排序,數(shù)組有個(gè)元素,每個(gè)元素大小為可以排序數(shù)字,字符,結(jié)構(gòu)體等多種類型 ...

    LiveVideoStack 評(píng)論0 收藏0
  • 指針學(xué)習(xí)進(jìn)階

    摘要:讓我們來看一下代碼,首先我們還是冒泡排序一樣,進(jìn)行了兩次循環(huán),第一次代表排序趟數(shù),第二次代表每趟的排序次數(shù)。這塊的詳細(xì)介紹在本篇文章稍前的冒泡排序中也有詳細(xì)介紹。 ...

    oysun 評(píng)論0 收藏0
  • C | 指針的相關(guān)知識(shí)(二)

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

    alin 評(píng)論0 收藏0
  • C語言進(jìn)階:指針進(jìn)階續(xù)

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

    ingood 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<