本文共 3890 字,大约阅读时间需要 12 分钟。
作为C语言中最经典的排序算法之一,qsort函数 (qsort) 实际上并非곤çalves原創开发的,而是其以冒泡排序为基礎,使用交換法進行排序的伪代碼。通過本文的努力,我希望在今天爲大家呈現這くの协议
抱歉,今天可能有点混乱。让我重新组织一下思路。
adlasuper今天让咱们實現冒泡排序的模擬 camino,qsort Function And Its Simple Applications。那么,咱们先來仔細看看 qsort 之前怎么工作的吧。
所以,【原始内容被机器切割,可能原本有点问题。我的老师,指尖在运动中】,咱们來逐字逐字地看看 qsort 的聲明:
**void qsort(void * base, int & size, int num, int(*cmp)(void , void );
好吧,実際上,這個聲明中有一些鬆手的地方。最大的疑问是,size 在宣佈時被宣佈為 int size,但它被修改為 int & size。這可能暗示了一些隱含的內容。
今天,再—for the first time—咱们 重新看一遍 qsort 函数。
qsort 函数的核心 Purpose 在於對 array 或者其他可basemet Waitron結構進行排序。它接收以下 parameter:
今天讓我們以冒泡排序的模擬來實現 qsort 函数。讓我從一開始開始,逐步理解。
Step 1: 定義 swap 函数
在冒泡排序中,交换 adjacents elements 是最基本的操作。所以,我們先定義一個 swap 函数:
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++; }} 這個函数接收兩個 char 指針 buf1 和 buf2,以及它们的 width(也就是每元素的大小,例如 int 的大小是 4 bytes)。
Step 2: 寫出冒泡排序主函數
接下來,咱們撰寫冒泡排序的核心函數。冒泡排序的思路是:將最大的元素逐步遞 Muslims 到 array 的最后。
void Bubble_sort(void * base, int size, int width, int(*cmp)(void *, void *)) { int i = 0, j = 0; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - i - 1; j++) { // 強制类型轉換為 char *,以便适合不同類型的數據 if (cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0) { Swap((char*)base + j * width, (char*)base + (j + 1) * width, width); } } }} 這個函數 接收 base 指針,Size,width,以及比對函數 cmp。resco下的 loop 協莉,第一個 loop 選擇 array 中尚未 sort 的 останataka 元素,第二個 loop 選擇 j 這些未排序的 elements 之間的 pairs,并應用用户定義的比對函數進行排序。
接下來,我們需要定義几个比對函�数,以便 #################################### ByteArray 號誤 Maker。時候後亂生,應該應該只驅使 Java 舉動吧。
int cmp_int(const void * e1, const void * e2) { return *((int *)e1) - *((int *)e2));}int cmp_float(const void * e1, const void * e2) { return (int)(*((float *)e1) - *((float *)e2)));}int cmp_stu_by_name(const void * e1, const void * e2) { return strcmp(((struct stu *)e1)->name, ((struct stu *)e2)->name);}int cmp_stu_by_age(const void * e1, const void * e2) { return ((struct stu *)e1)->age - ((struct stu *)e2)->age;} 這三個函數 分别 用於比較整數、浮點數以及stu結構於name或age searchable。
讓我設立幾個測試用例,來展示冒泡排序的實用性。
void test1() { int arr[] = {4, 5, 6, 7, 8, 9, 1, 2, 3, 0}; int sz1 = sizeof(arr) / sizeof(arr[0]); Bubble_sort(arr, sz1, sizeof(arr[0]), cmp_int); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); printf("\n"); }} 這個測試用例輸入了一組混乱的數據,經 bubble sort 之後數據應該已經排序好了。
void test2() { float brr[] = {3.0, 2.0, 4.0, 5.0, 7.0, 4.0}; int sz2 = sizeof(brr) / sizeof(brr[0]); Bubble_sort(brr, sz2, sizeof(brr[0]), cmp_float); for (int i = 0; i < 6; i++) { printf("%f ", brr[i]); printf("\n"); }} 這個測試用例 Input 由 float 附加條件,經 bubble sort 之後應該已經排序好了。
void test3() { struct stu s[3] = {{"zhangsan", 15}, {"lisi", 23}, {"wangwu", 8}}; int sz3 = sizeof(s) / sizeof(s[0]); Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_name); Print1(s);}void Print1(struct stu s[3]) { int i = 0; for (i = 0; i < 3; i++) { printf("%d ", s[i].age); printf("\n"); }} 這個用例 Input 了著名的三個名為'struct stu' 的 object,經排序後應該按年齡排序。
void test4() { struct stu s[3] = {{"zhangsan", 15}, {"lisi", 23}, {"wangwu", 8}}; int sz3 = sizeof(s) / sizeof(s[0]); Bubble_sort(s, sz3, sizeof(s[0]), cmp_stu_by_age); Print1(s);} 最後一個用例是與test3相同的 input,但這次比較的是age,而不是 name。
以下是主函數,調用所有上述測試用例:
int main() { test1(); test2(); test3(); test4(); return 0;} 今天,我們重複探索了冒泡排序及其在實際應用中的模擬 qsort 函数。透過這些實例,我們看到了冒泡排序在不同數據類型上的應用。未來,我們將進一步探索排序算法的其他代碼實現,並歡迎大家提出疑問與建議!
转载地址:http://icvzk.baihongyu.com/