首页 > 其他分享 >"全类型" 排序(选择、冒泡) 回调函数

"全类型" 排序(选择、冒泡) 回调函数

时间:2023-03-19 09:44:25浏览次数:49  
标签:size compare addr int void elem 冒泡 排序 函数

直接上代码

若代码有可优化或某处不合理,欢迎指正,不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare_double(void* dst_addr, void* src_addr)
{
    return (*(double*)dst_addr > *(double*)src_addr);
}

int compare_char(void* dst_addr, void* src_addr)
{
    return (*(char*)dst_addr > *(char*)src_addr);
}

int compare_int(void* dst_addr, void* src_addr)
{
    return (*(int*)dst_addr > *(int*)src_addr);
}

void select_sort_all_type(void* arr, int len, int elem_size, int(*)(void*, void*));
void blue_sort_all_type(void* arr, int len, int elem_size, int (*compare)(void*, void*));

int main(int argc, char* argv[])
{
    int arr[8] = {43, 56, 34, 23, 42, 78, 96, 73};
    char buf[] = "hello world";
    double num[7] = {3.2, 3.1, 5.4, 3.0, 6.7, 4.3, 2.9};
    int i = 0;

    // int类型数组回调
    select_sort_all_type(arr, 8, sizeof(int), compare_int);
    blue_sort_all_type(arr, 8, sizeof(int), compare_int);
    for(i = 0; i < 8; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // char类型数组回调
    select_sort_all_type(buf, strlen(buf), sizeof(char), compare_char);
    blue_sort_all_type(buf, strlen(buf), sizeof(char), compare_char);
    printf("%s\n", buf);

    // double类型数组回调
    select_sort_all_type(num, 7, sizeof(double), compare_double);
    blue_sort_all_type(num, 7, sizeof(double), compare_double);
    for(i = 0; i < 7; i++)
    {
        printf("%lf ", num[i]);
    }
    printf("\n");

    return 0;
}

void select_sort_all_type(void* arr, int len, int elem_size, int (*compare)(void*, void*))
{
    void *i_addr = arr;
    void *end_addr = arr + len*elem_size;
    for(; i_addr < end_addr-elem_size; i_addr += 1*elem_size)
    {
        void *s_addr = i_addr;
        void *j_addr = i_addr + 1*elem_size;
        for(; j_addr < end_addr; j_addr += 1*elem_size)
        {
            if(compare(s_addr, j_addr))
            {
                s_addr = j_addr;
            }
        }
        if(s_addr != i_addr)
        {
            void* tmp_addr = calloc(1, elem_size);
            memcpy(tmp_addr ,s_addr ,elem_size);
            memcpy(s_addr ,i_addr ,elem_size);
            memcpy(i_addr ,tmp_addr ,elem_size);
            free(tmp_addr);
        }
    }
    return;
}

void blue_sort_all_type(void* arr, int len, int elem_size, int (*compare)(void*, void*))
{

    void* end_addr = arr + len*elem_size;
    int i = 0;
    for(i = 0; i < len - 1; i++)
    {
        void* j_addr = arr;
        for(;j_addr < end_addr - (i*elem_size) - elem_size; j_addr += 1*elem_size)
        {
            if(compare(j_addr, j_addr + elem_size))
            {
                void* t_addr = calloc(1, elem_size);
                memcpy(t_addr, j_addr, elem_size);
                memcpy(j_addr, j_addr+elem_size, elem_size);
                memcpy(j_addr+elem_size, t_addr, elem_size);
                free(t_addr);
            }
        }
    }
    return;
}

标签:size,compare,addr,int,void,elem,冒泡,排序,函数
From: https://www.cnblogs.com/qinghuan190319/p/17232489.html

相关文章

  • 110Js自执行函数
    JavaScript自执行函数(Self-ExecutingFunctions),也被称为立即执行函数(ImmediatelyInvokedFunctionExpressions,IIFE),是一种常见的JavaScript编程模式。这种模式的基本思路......
  • 二维数组冒泡排序
    0.本文结构概述二维数组在内存中是线性存储二维数组排序(C语言代码)1.二维数组在内存中是线性存储2.二维数组排序(C语言代码)#include<stdio.h>intmain(intarg......
  • SQL函数大全和用法
    正常Gender字段,因为一些原因,使用了bit类型,0表示男,1表示女,我们在查询的时候,只会显示ture或者falseselectIdas编号,Nameas姓名,Genderas性别FromTable_User......
  • acwing113. 特殊排序
    题目来源acwing题目难度2星算法标签二分参考程序//ForwarddeclarationofcompareAPI.//boolcompare(inta,intb);//returnboolmeanswhetheraisles......
  • 函数【返回值】
    0.本文结构概述若函数无返回值,默认为int类型返回值小于4B,存入寄存器EAX中返回值大于4B小于8B,存入寄存器EAX和EDX中返回值大于8B放入栈区的临时空间1.若函数无返回......
  • 如何理解strcpy函数中的赋值语句?
    关于strcpy函数的赋值语句如何理解while(*s++=*t++)?voidstrcpy(char*s,char*t){while(*s++=*t++);}该语句等价于while(*(s++)=*(t++))。赋值......
  • webpack原理(3):Tapable源码分析及钩子函数作用分析
    webpack本质上是一种事件流的机制,它的工作流程就是将各个插件串联起来,而实现这一切的核心就是Tapable,webpack中最核心的负责编译的Compiler和负责创建bundles的Compilation......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上写......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上......
  • 反汇编strlen函数
    0.本文结构概述strlen库函数实现原理公式分析(变换形式)计算步骤分析(有些繁琐,后续会修改优化)C语言实现该函数汇编语言实现该函数1.strlen库函数实现原理使用VS2......