溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言庫函數(shù)qsort如何使用

發(fā)布時間:2022-06-14 11:44:25 來源:億速云 閱讀:148 作者:iii 欄目:開發(fā)技術

本篇內(nèi)容介紹了“C語言庫函數(shù)qsort如何使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、回調函數(shù)

    C語言庫函數(shù)中的qsort的是一個回調函數(shù),回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù)。如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個 函數(shù),當這個指針被用來調用其所指向的函數(shù)時,我們就說這是回調函數(shù)?;卣{函數(shù)不是由該函數(shù)的實現(xiàn)方直接調用,而是在特定的事件或條件發(fā)生時由另外的一方調用的,用于對該事件或條件進行響應。

    二、庫函數(shù)qsort

    C語言庫函數(shù)qsort如何使用

    void* base:要排序的數(shù)據(jù)的起始位置

    size_t num:待排序數(shù)據(jù)的元素個數(shù)

    size_t width:待排序的數(shù)據(jù)元素的大小,單位是字節(jié)

    int(__cdecl*compare)(constvoid*elem1,constvoid*elem2):把比較函數(shù)的地址傳給cmp,e1和e2是要比較的兩個元素的地址。(__cdecl是函數(shù)調用約定)

    注意:最后一個函數(shù)參數(shù)是一個函數(shù)指針,所以在調用庫函數(shù)qsort()的時候,傳的參數(shù)是比較函數(shù)的地址。

    C語言庫函數(shù)qsort如何使用

    1、e1小于e2,返回值小于0;

    2、e1等于e2,返回0;

    3、e1大于e2,返回值大于0。

    三、使用qsort排序整型數(shù)組

    #include <stdlib.h>
    #include <stdio.h>
    int int_cmp(const void* e1, const void* e2)
    {
    	return *(int*)e1 - *(int*)e2;//升序排序
    }
    int main()
    {
    	int arr[10] = { 9,8,7,6,5,2,4,3,1,0 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	qsort(arr, sz, sizeof(arr[0]), int_cmp);
    	for (int i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);//打印0 1 2 3 4 5 6 7 8 9
    	}
    	return 0;
    }

    庫函數(shù)qsort的比較函數(shù)是需要自己實現(xiàn)的,并且已經(jīng)給定了比較函數(shù)的兩個形參。因為e1和e2是無類型指針,不能解引用和加減。所以此處使用時需要先將指針類型前置類型轉換為int*,再進行解引用操作。

    此處可以加深回調函數(shù)的理解:int_cmp是本人來實現(xiàn)的,當程序運行到qsort函數(shù)時,由庫函數(shù)qsort對int_cmp進行調用。這就是回調函數(shù)。

    四、使用qsort排序結構體

    1、使用qsort排序結構體中的字符成員

    C語言庫函數(shù)qsort如何使用

    先創(chuàng)建一個學生的結構體類型,定義一個結構體類型的學生數(shù)組,數(shù)組內(nèi)包含3名學生的信息。通過qsort函數(shù)進行排序。在實現(xiàn)str_name_cmp函數(shù)時,需要先將e1和e2先強制類型轉換為struct Stu*類型,由于strcmp函數(shù)的返回值剛好契合str_name_cmp函數(shù),可以直接使用return將返回值帶回。通過打印可以發(fā)現(xiàn)三名同學已經(jīng)按ASCII碼完成排序。

    2、使用qsort排序結構體中的整型成員

    #include <stdlib.h>
    #include <stdio.h>
    struct Stu
    {
    	char name[20];
    	int age;
    };
    int str_age_cmp(const void* e1, const void* e2)
    {
    	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
    }
    int main()
    {
    	struct Stu s[] = { {"zhangsan",18},{"lisi",17},{"wangwu",22} };
    	int sz = sizeof(s) / sizeof(s[0]);
    	qsort(s, sz, sizeof(s[0]), str_age_cmp);
    	for (int i = 0; i < sz; i++)
    	{
    		printf("%d ", s[i].age);//輸出17 18 22
    	}
    	return 0;
    }

    排序結構體整型成員和排序整型數(shù)組、結構體字符成員方式相似。

    五、基于冒泡排序的庫函數(shù)qsort的模擬實現(xiàn)

    1、使用改寫函數(shù)排序整型數(shù)組

    #include <stdlib.h>
    #include <stdio.h>
    int int_cmp(const void* e1, const void* e2)//比較函數(shù)
    {
    	return *(int*)e1 - *(int*)e2;//升序排序
    }
    Swap(char* p1, char* p2, size_t width)
    {
    	for (int i = 0; i < width; i++)//每個字節(jié)交換
    	{
    		int tmp = *p1;
    		*p1 = *p2;
    		*p2 = tmp;
    		p1++;
    		p2++;
    	}
    }
    void qsort_bubble(void* base, size_t sz, size_t width, int(* compare)(const void* e1, const void* e2))
    {//基于庫函數(shù)qsort進行改寫的冒泡排序
    	for (int i = 0; i < sz-1; i++)
    	{
    		int change = 0;
    		for (int j = 1; j < sz - i; j++)
    		{
                //交換
    			if (compare((char*)base+(j-1)*width , (char*)base+j*width)>0)
    			{
    				Swap((char*)base + (j - 1) * width, (char*)base + j * width,width);
    				change = 1;
    			}
    		}
    		if (change == 0)
    			break;
    	}
    }
    int main()
    {
    	int arr[10] = { 9,8,7,6,5,2,4,3,1,0 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	qsort_bubble(arr, sz,sizeof(arr[0]),int_cmp);
    	for (int i = 0; i < sz; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }

    qsort_bubble函數(shù)中,采用冒泡排序的比較方式,形參模仿庫函數(shù)qsort中的形參。

    在函數(shù)內(nèi)部調用compare時(compare是比較函數(shù)的地址),由于外部比較的數(shù)據(jù)類型不可知,故使用最小內(nèi)置類型char和數(shù)據(jù)類型的長度width來表示外部類型所占字節(jié)。

    2、使用改寫函數(shù)排序結構體中的字符成員

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    struct Stu//定義結構體
    {
    	char name[20];
    	int age;
    };
    int str_name_cmp(const void* e1, const void* e2)//字符的比較函數(shù)
    {
    	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
    }
    Swap(char* p1, char* p2, size_t width)//交換函數(shù)
    {
    	for (int i = 0; i < width; i++)
    	{
    		int tmp = *p1;
    		*p1 = *p2;
    		*p2 = tmp;
    		p1++;
    		p2++;
    	}
    }
    void qsort_bubble(void* base, size_t sz, size_t width, int(*compare)(const void* e1, const void* e2))
    {基于庫函數(shù)qsort進行改寫的冒泡排序
    	for (int i = 0; i < sz - 1; i++)
    	{
    		int change = 0;
    		for (int j = 1; j < sz - i; j++)
    		{
    			if (compare((char*)base + (j - 1) * width, (char*)base + j * width)>0)
    			{
    				Swap((char*)base + (j - 1) * width, (char*)base + j * width, width);
    				change = 1;
    			}
    		}
    		if (change == 0)
    			break;
    	}
    }
    int main()
    {
    	struct Stu s[] = {{"zhangsan",18},{"lisi",17},{"wangwu",22}};
    	int sz = sizeof(s) / sizeof(s[0]);
    	qsort(s, sz, sizeof(s[0]), str_name_cmp);
    	for (int i = 0; i < sz; i++)
    	{
    		printf("%s ", s[i].name);
    	}
    	return 0;
    }

    輸出結果lisi wangwu zhangsan,理解方式和上方例子一樣。

    3、對庫函數(shù)qsort的總結

    第一次使用庫函數(shù)qsort的時候,肯定會疑惑,為什么e1-e2的返回值大于0時,升序排序;反之降序?

    我們在模擬實現(xiàn)的時候,在冒泡排序內(nèi)部調用compare這個函數(shù)地址,傳參時,如果前一個元素的值大于后一個元素,那么傳入比較函數(shù),e1-e2>0,進行交換,交換完畢后e1<e2,實現(xiàn)了升序排序!

    如果要實現(xiàn)降序排序,在比較函數(shù)內(nèi)使用e2-e1即可,意思是后一個元素大于前一個元素,進行交換,交換完畢后e1>e2,實現(xiàn)了降序排序!

    六、力扣977#中庫函數(shù)qsort的使用

    C語言庫函數(shù)qsort如何使用

    使用pow函數(shù)對數(shù)組元素逐個平方。由于素組內(nèi)存在負數(shù),所以平方后數(shù)組可能亂序,需要重新排序,這里可以使用庫函數(shù)qsort進行排序。

     int compare(const void* elem1,const void* elem2)//比較函數(shù)
     {
         return *(int*)elem1-*(int*)elem2;
     }
    int* sortedSquares(int* nums, int numsSize, int* returnSize){
        *returnSize=numsSize;
        for(int i=0;i<numsSize;i++)
        {
            nums[i]=pow(nums[i],2);
        }
        qsort(nums,numsSize,sizeof(nums[0]),compare);//庫函數(shù)qsort的使用
        return nums;
    }

    但是平常刷題是還是不建議無腦上qsort,需要根據(jù)題目要求合理的選擇排序算法。

    “C語言庫函數(shù)qsort如何使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI