erJSu 2024-05-14 14:11 采纳率: 80%
浏览 4

再写一个排序算法,然后符合要求


#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
/** Our old friend die from ex17. */
void die(const char *message)
{
    if (errno)
    {
        perror(message);
    }
    else
    {
        printf("ERROR: %s\n", message);
    }
 
    exit(1);
}
 
// a typedef creates a fake type, int this
//  case for a function pointer
typedef int (*compare_cb)(int a, int b);
 
/**
 *
 * A classsic bubble sort function that uses the
 * compare_cb to  do the sorting.
 */
int *bubble_sort(int *numbers, int count, compare_cb cmp)
{
    int temp = 0;
    int i = 0;
    int j = 0;
    int *target = (int *)malloc(count * sizeof(int));
 
    if (!target)
        die("Memory error.");
 
    memcpy(target, numbers, count * sizeof(int));
 
    for (i = 0; i < count; i++)
    {
        for (j = 0; j < count - 1; j++)
        {
            if (cmp(target[j], target[j + 1]) > 0)
            {
                temp = target[j + 1];
                target[j + 1] = target[j];
                target[j] = temp;
            }
        }
    }
 
    printf("I:%d J:%d\n", i, j);
    return target;
}
 
int sorted_order(int a, int b)
{
    return a - b;
}
 
int reverse_order(int a, int b)
{
    return b - a;
}
 
int strange_order(int a, int b)
{
    if (a == 0 || b == 0)
    {
        return 0;
    }
    else
    {
        return a % b;
    }
}
 
/**
 * Used to test that we are sorting things correctly
 * by doing the sort and printging it out;
 */
void test_sorting(int *numbers, int count, compare_cb cmp)
{
    int i = 0;
    int *sorted = bubble_sort(numbers, count, cmp);
 
    if (!sorted)
        die("Failed to sort as requested.");
 
    for (i = 0; i < count; i++)
    {
        printf("%d ", sorted[i]);
    }
    printf("\n");
 
    free(sorted);
}
 
int main(int argc, char *argv[])
{
    if (argc < 2)
        die("USAGE: ./ex18 4 3 1 5 6");
    int count = argc - 1; // except ./ex18
    int i = 0;
    char **inputs = argv + 1; // cha 1
 
    int *numbers = (int *)malloc(count * sizeof(int));
    if (!numbers)
        die("Memory error.");
 
    for (i = 0; i < count; i++)
    {
        numbers[i] = atoi(inputs[i]);
    }
 
    test_sorting(numbers, count, sorted_order);
    test_sorting(numbers, count, reverse_order);
    test_sorting(numbers, count, strange_order);
 
    free(numbers);
 
    return 0;
}

再写一个排序算法,然后修改test_sorting, 让它可以接受任意排序函数以及排序函数的回调比较。用它来测试你的两个算法。

  • 写回答

2条回答 默认 最新

  • 笑面虎 2024-05-14 14:12
    关注

    以下内容由CHATGPT及笑面虎共同生成、有用望采纳:


    【您想要解决的问题】: 您的目的是要在C语言中实现一个新的排序算法,并修改现有的 test_sorting 函数,使其能够接受任意的排序函数以及排序函数的回调比较。您希望使用这个修改后的 test_sorting 函数来测试包括新排序算法在内的两个算法。

    【问题出现原因】: 这个问题出现的原因是您想要扩展现有的排序测试函数,使其更加通用,能够适应不同的排序算法和比较函数。现有的 test_sorting 函数是为特定的排序算法和比较函数设计的,因此需要修改以提高其灵活性。

    【问题解决方案】: 为了解决这个问题,我们可以采取以下步骤:

    1. 修改 test_sorting 函数,使其能够接受一个额外的参数,即排序算法的函数指针。
    2. 创建一个新的排序算法函数,例如插入排序或快速排序。
    3. 修改 main 函数,以便能够调用新的排序算法函数,并传递相应的比较函数。

    【提供代码】: 以下是修改后的代码,包括一个新的插入排序算法和修改后的 test_sorting 函数:

    // ...(之前的代码保持不变)
    
    /**
     * A classic insertion sort function that uses the
     * compare_cb to do the sorting.
     */
    int *insertion_sort(int *numbers, int count, compare_cb cmp)
    {
        for (int i = 1; i < count; i++)
        {
            int key = numbers[i];
            int j = i - 1;
    
            while (j >= 0 && cmp(numbers[j], key) > 0)
            {
                numbers[j + 1] = numbers[j];
                j = j - 1;
            }
            numbers[j + 1] = key;
        }
        return numbers;
    }
    
    // 修改后的 test_sorting 函数
    void test_sorting(int *numbers, int count, compare_cb cmp, void (*sort_func)(int *, int, compare_cb))
    {
        int *sorted = (int *)malloc(count * sizeof(int));
        if (!sorted)
            die("Memory error.");
    
        memcpy(sorted, numbers, count * sizeof(int));
        sort_func(sorted, count, cmp);
    
        printf("Sorted: ");
        for (int i = 0; i < count; i++)
        {
            printf("%d ", sorted[i]);
        }
        printf("\n");
    
        free(sorted);
    }
    
    // ...(main函数中的其他代码保持不变)
    
    int main(int argc, char *argv[])
    {
        // ...(main函数中的其他代码保持不变)
    
        test_sorting(numbers, count, sorted_order, bubble_sort);
        test_sorting(numbers, count, reverse_order, bubble_sort);
        test_sorting(numbers, count, strange_order, bubble_sort);
        test_sorting(numbers, count, sorted_order, insertion_sort); // 使用新的插入排序算法
    
        free(numbers);
    
        return 0;
    }
    

    【代码运行方式】: 您需要一个C语言的编译环境,如GCC。将上述代码保存为 .c 文件,然后在命令行中使用以下命令编译和运行:

    gcc -o sorting_program your_code.c
    ./sorting_program 4 3 1 5 6
    

    【代码预期运行结果】: 如果您输入 4 3 1 5 6,那么预期的输出将是使用 sorted_orderreverse_orderstrange_order 和新插入排序算法排序后的数组。

    【推荐相关链接】:

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月14日

悬赏问题

  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)
  • ¥30 python,LLM 文本提炼
  • ¥15 关于将inet引入的相关问题
  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!