目錄
10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有潮安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。一、認(rèn)識qsort()函數(shù)
二、使用qsort()函數(shù)
?1:??冒泡排序:?C語言實(shí)現(xiàn)冒泡排序【全解析】_weixin_52872520的博客-博客
?2:qsort()函數(shù):
3:具體使用:
三、模擬實(shí)現(xiàn)qsort()函數(shù)
四、以排序整形為例講解qsort()函數(shù)
void qsort( void *base, //待排序數(shù)組的起始地址
size_t num, //元素個數(shù)
size_t width, //一個元素的大小,單位:字節(jié)
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
//兩個元素的比較函數(shù)
//通過函數(shù)指針調(diào)用自己定義的比較函數(shù),這個定義的比較函數(shù)被稱為回調(diào)函數(shù)
二、使用qsort()函數(shù)
? ? ? ?1:??冒泡排序:?C語言實(shí)現(xiàn)冒泡排序【全解析】-博客
? ? ? ?2:qsort()函數(shù):在冒泡排序中,已經(jīng)實(shí)現(xiàn)了整形數(shù)組的排序,可是對于字符數(shù)組、浮點(diǎn)型數(shù)組、結(jié)構(gòu)體數(shù)組等其他類型的排序就不用去自己寫算法實(shí)現(xiàn),而是通過qsort() - 快速排序?qū)崿F(xiàn)。
int ( *compare )(const void *elem1, const void *elem2 )
函數(shù)的形參被指定為 void* ,可以理解為 void* 為一個通用指針(垃圾桶),可以接收任何類型的指針,void* 的指針不能解引用和 ++,即不能直接使用。但是可以對 void* 的指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換后使用。
例如:
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
在比較函數(shù)中:
3:具體使用:? 快速排序整形數(shù)組:
#include#includeint cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
void main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
//庫函數(shù)中一個排序函數(shù):qsort
qsort(arr, sz, sizeof(arr[0]), cmp_int);
//0 1 2 3 4 5 6 7 8 9
//打印
int i = 0;
for (i = 0; i< sz; i++)
{
printf("%d ", arr[i]);
}
}
? 快速排序結(jié)構(gòu)體:
#include#includestruct Stu
{
char name[20];
int age;
};
//按照學(xué)生的年齡來排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照學(xué)生的名字來排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比較函數(shù):按照對應(yīng)位置上的字符串大小進(jìn)行比較的
//abcdef 小
//abd 大
int main()
{
struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
int sz = sizeof(s) / sizeof(s[0]);
//qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
return 0;
}
三、模擬實(shí)現(xiàn)qsort()函數(shù)? 改造冒泡排序函數(shù),使得該函數(shù)可以排序任意指定的數(shù)組。
//使用我們自己寫的bubble_sort函數(shù)排序整型數(shù)組
#include#include//
//實(shí)現(xiàn)一個比較整型的函數(shù)
//
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
struct Stu
{
char name[20];
int age;
};
//按照學(xué)生的年齡來排序
int cmp_stu_by_age(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照學(xué)生的名字來排序
int cmp_stu_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp() : 字符串比較函數(shù):按照對應(yīng)位置上的字符串大小進(jìn)行比較的
//abcdef 小
//abd 大
void Swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i< width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//改造冒泡排序函數(shù),使得這個函數(shù)可以排序任意指定的數(shù)組
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{
//趟數(shù)
size_t i = 0;
for (i = 0; i< sz - 1; i++)
{
//一趟冒泡排序的過程
size_t j = 0;
for (j = 0; j< sz - 1 - i; j++)
{
//判斷
//base為void*,需要強(qiáng)制類型轉(zhuǎn)換為char*【僅為一個字節(jié)】,可以靈活運(yùn)用;j * width:跳過的步長
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) >0)//用自定義的cmp函數(shù)來比較;
{
//交換
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i< sz; i++)
{
printf("%d ", arr[i]);
}
}
//使用我們自己寫的bubble_sort函數(shù)排序結(jié)構(gòu)體數(shù)組
void test2()
{
struct Stu s[3] = { {"zhangsan",20}, {"lisi", 50}, {"wangwu", 33} };
int sz = sizeof(s) / sizeof(s[0]);
//bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_age);
bubble_sort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
test1();
//test2();
return 0;
}
四、以排序整形為例講解qsort()函數(shù)Ⅰ:定義一個降序的整形數(shù)組;
Ⅱ:求得整型數(shù)組的大?。?/p>
Ⅲ:進(jìn)入bubble_sort()函數(shù)進(jìn)行排序;
? Ⅲ①:理解整個bubble_sort函數(shù);
? Ⅲ②:利用兩層for循環(huán)來達(dá)到冒泡排序的效果;
? Ⅲ③:判斷前兩個元素的大小:將void*base 的指針強(qiáng)制類型轉(zhuǎn)換為char*,而 j*width 則為一個數(shù)據(jù)的大小,利用cmp()函數(shù)進(jìn)行比較;
Ⅲ④:實(shí)現(xiàn)cmp_int();整形比較的函數(shù)
? Ⅲ⑤:實(shí)現(xiàn)兩個元素的交換;
Ⅳ:依照冒泡排序的思想,在bubble_sout()函數(shù)中不斷排序,達(dá)到對整形數(shù)組排序的效果;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧