国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

qsort函數用法以及如何自己實現

jerry / 2272人閱讀

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

聲明

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

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

參數

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

返回值

該函數不返回任何值。

舉例如下:

#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函數就是多功能版的冒泡排序,讓我們在冒泡排序的基礎上更改;

冒泡排序參數只需要首地址,元素個數,qsort函數的參數分別要傳首地址,元素個數,單位字節數,排序規則(是個函數),相同的是有兩層循環,外層循環是一共排多少趟,內層是一趟排列多少對,在原地址排序不要要返回值;

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

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

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

當內部循環 j=0?時,第一個元素可以表示為(char*)base+j*width

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

當 前者 大于 后者 時要進行交換,交換函數與冒泡函數有所不同;

最后一點:規則排序函數

排列int型,上面有

再舉一個例子,排列結構體類型;

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

當前者大于后者將返回一個正數,與上面判斷大于0時交換數據相呼應;?

排列整形源代碼如下:

#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*)){	//趟數;	for (int i = 0; i < num; i++)	{		//比較對數;		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");}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119013.html

相關文章

  • qsort()函數詳解

    摘要:函數詳解函數原型函數的作用及用法函數的參數函數實例排序一個整型數組排序一個結構體用冒泡排序模擬一個函數函數原型函數的作用及用法函數的功能是對數組進行排序,數組有個元素,每個元素大小為可以排序數字,字符,結構體等多種類型 ...

    LiveVideoStack 評論0 收藏0
  • 指針學習進階

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

    oysun 評論0 收藏0
  • C | 指針的相關知識(二)

    摘要:回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用于對該事件或條件進行響應。 目錄 前言無類型指針結構體指針枚舉變量指針函數...

    alin 評論0 收藏0
  • C語言進階:指針進階續

    摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進行指針運算解引用,整數等。求指針所占字節而不是解引用訪問權限大小。數組就是整個數組的大小,數組元素則是數組元素的大小,指針大小都為。 ...

    ingood 評論0 收藏0

發表評論

0條評論

jerry

|高級講師

TA的文章

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