博客
关于我
用冒泡排序模拟实现qsort函数
阅读量:759 次
发布时间:2019-03-23

本文共 3890 字,大约阅读时间需要 12 分钟。

冒泡排序仿真——剖析qsort函数

作为C语言中最经典的排序算法之一,qsort函数 (qsort) 实际上并非곤çalves原創开发的,而是其以冒泡排序为基礎,使用交換法進行排序的伪代碼。通過本文的努力,我希望在今天爲大家呈現這くの协议

弟洽Dear用户,今天么です?

抱歉,今天可能有点混乱。让我重新组织一下思路。

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 的基本 functionalities

qsort 函数的核心 Purpose 在於對 array 或者其他可basemet Waitron結構進行排序。它接收以下 parameter:

  • base:排序操作的起始位置,常常是指向 array 的指針。
  • size:array 的大小。
  • num:实际上,這個 參數似乎沒有太多用處,可能在某些版本中還存在。
  • cmp:一個比對函數,用於決定兩個元素之間的大小關係。
  • 逐寸俱alling ourselves

    今天讓我們以冒泡排序的模擬來實現 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 指針 buf1buf2,以及它们的 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,并應用用户定義的比對函數進行排序。

    定義比較函umbledore

    接下來,我們需要定義几个比對函�数,以便 #################################### 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。

    Test Cases

    讓我設立幾個測試用例,來展示冒泡排序的實用性。

    测试年龄排序

    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 之後數據應該已經排序好了。

    测试浮 POINTS 排序

    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 之後應該已經排序好了。

    测试.'stu'結構排序(按名順序)

    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,經排序後應該按年齡排序。

    测试.'stu'結構排序(按年齡)

    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/

    你可能感兴趣的文章
    Objective-C实现LRU 缓存算法(附完整源码)
    查看>>
    Objective-C实现LRU缓存(附完整源码)
    查看>>
    Objective-C实现lstm prediction预测算法(附完整源码)
    查看>>
    Objective-C实现lucas数列算法(附完整源码)
    查看>>
    Objective-C实现Luhn (Mod 10)Algorithm算法(附完整源码)
    查看>>
    Objective-C实现LZW编码(附完整源码)
    查看>>
    Objective-C实现MAC桌面暗水印(附完整源码)
    查看>>
    Objective-C实现mandelbrot曼德勃罗特集算法(附完整源码)
    查看>>
    Objective-C实现markov chain马尔可夫链算法(附完整源码)
    查看>>
    Objective-C实现MATLAB中Filter函数功能(附完整源码)
    查看>>
    Objective-C实现matrix exponentiation矩阵求幂算法(附完整源码)
    查看>>
    Objective-C实现MatrixMultiplication矩阵乘法算法 (附完整源码)
    查看>>
    Objective-C实现max non adjacent sum最大非相邻和算法(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现max sum sliding window最大和滑动窗口算法(附完整源码)
    查看>>
    Objective-C实现MaxHeap最大堆算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
    查看>>
    Objective-C实现maxpooling计算(附完整源码)
    查看>>
    Objective-C实现max_difference_pair最大差异对算法(附完整源码)
    查看>>