sort冒泡排序模拟实现

第一次尝试
#include<stdio.h>
#include<stdlib.h>

typedef void(*CMP)(int*, int*);

CMP Bubbup(int* m, int* n) {
    if (*m > * n) {
        int t = 0;
        t = *m;
        *m = *n;
        *n = t;
        }
}
CMP Bubbdown(int* m, int* n) {
    if (*m < * n) {
        int t = 0;
        t = *m;
        *m = *n;
        *n = t;
    }
}

void BubbleSort(int* arr,int size,CMP cmp) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size - i; j++) {
            cmp(&arr[j], &arr[j + 1]);
        }
    }
}

int main() {
    int arr[10] = { 56,23,48,51,27,19,36,67,92,40 };
    int size = sizeof(arr) / sizeof(arr[0])-1;
    for (int i = 0; i <= size; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    //升序排序
    BubbleSort(arr, size, Bubbup);
    for (int i = 0; i <= size; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    //降序排序
    BubbleSort(arr, size, Bubbdown);
    for (int i = 0; i <= size; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    return 0;
}

使用函数指针,利用回调函数的机制,可以在一定的条件下,调用写好的函数,实现一定的功能:

  1. 定义一个函数(普通函数即可);
  2. 将此函数的地址注册给调用者;
  3. 特定的事件或条件发生时,调用者使用函数指针调用回调函数。
第二次尝试
#include<stdio.h>
#include<stdlib.h>

int cmpup(int* a, int* b) {
    return *a - *b;
}
int cmpdown(int* a, int* b) {
    return *b - *a;
}

void myBubble(void* base, size_t size, size_t num, int (*CMP)(const void*, const void*)) {
    //使用char可以进行一个字节一个字节的加减,只要传入对应数组的类型字节大小
    //就可以实现,通用数组类型的冒泡排序
    char* st = (char*)base;
    //用来临时交换的数组,个的空见要足够大,不要pia气,要防止意外出现
    char tmp[16];
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - i - 1; j++) {
            if (CMP(st+j*size,st+(j+1)*size) > 0) {
                //memcpy(void* destin,void* source,unsigned n)函数,从源source中拷贝n个字节到目标destin中
                //不知道传入数组的类型,就可以使用memcpy函数,然后根据输入类型字节大小,拷贝对应的字节
                memcpy(tmp, st+j*size, size);
                memcpy(st+j * size, st+(j + 1) * size, size);
                memcpy(st+(j + 1) * size, tmp, size);
            }
        }
    }
}

int main() {
    int arr[10] = { 56,23,48,51,27,19,36,67,92,40 };
    int size = sizeof(arr[0]);
    int num = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < num; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    //升序排序
    myBubble(arr, size,num, cmpup);
    for (int i = 0; i < num; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    //降序排序
    myBubble(arr, size, num, cmpdown);
    for (int i = 0; i < num; i++) {
        printf("%d ", arr[i]);
    }printf("\n");
    return 0;
}

这是改进之后的冒泡排序,现在功能更完整,可以对不同类型的数组进行排序,可以用户自定义一个函数来确定升序还是降序,具体解析,详见代码中的注释。


博客园发表于 2020-11-16 12:19

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值