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


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 erJSu 2024-05-14 14:11 采纳率: 80% 浏览 4 首页/ 编程语言 / 再写一个排序算法,然后符合要求 c语言 #include #include #include #include #include /** 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, 让它可以接受任意排序函数以及排序函数的回调比较。用它来测试你的两个算法。​ 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    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 和新插入排序算法排序后的数组。

      【推荐相关链接】:

      展开全部

      评论 编辑记录
    • 专家-皆知 2024-05-14 14:12
      关注

      使用快速排序算法实现数组排序。

      以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。

      评论
      专家-皆知 回复 erJSu 2024-05-14 14:13

      为了实现这个功能,我们可以创建一个新的通用排序函数,并在test_sorting中使用它。首先,我们需要定义一个新的通用排序函数,它接受一个数组、元素数量、比较函数和额外参数(如果有)。接下来,我们将修改test_sorting函数,使其接受额外的参数——排序函数和可能的额外参数。以下是修改后的代码:

      #include 
      #include 
      #include 
      #include 
      #include 
      
      // 定义用于传递额外参数的结构体
      typedef struct {
          void* extra_data;
      } SortContext;
      
      // 新的通用排序函数
      void generic_sort(void* array, size_t count, int (*compare)(const void*, const void*, void*), void* context) {
          size_t i, j;
          void* temp;
      
          for (i = 0; i < count - 1; i++) {
              for (j = 0; j < count - i - 1; j++) {
                  if (compare(&((char*)array)[j * sizeof(*array)], &((char*)array)[(j + 1) * sizeof(*array)], context) > 0) {
                      temp = ((char*)array)[j];
                      ((char*)array)[j] = ((char*)array)[j + 1];
                      ((char*)array)[j + 1] = temp;
                  }
              }
          }
      }
      
      // 修改后的test_sorting函数,接受排序函数、额外参数和数组长度
      void test_sorting(void* numbers, size_t count, int (*sort_func)(void*, size_t, int (*)(const void*, const void*, void*), void*), ...) {
          va_list args;
          va_start(args, sort_func);
      
          void* extra_data = va_arg(args, void*);
          generic_sort(numbers, count, sort_func, extra_data);
      
          va_end(args);
      
          int i;
          for (i = 0; i < count; i++) {
              printf("%d ", *((int*)numbers + i));
          }
          printf("\n");
      }
      
      // 原有的三个比较函数
      int sorted_order(const void* a, const void* b, void* context) {
          return (*((int*)a)) - (*((int*)b));
      }
      
      int reverse_order(const void* a, const void* b, void* context) {
          return (*((int*)b)) - (*((int*)a));
      }
      
      int strange_order(const void* a, const void* b, void* context) {
          int* data = (int*)context;
          int a_val = (*((int*)a)), b_val = (*((int*)b));
      
          if (a_val == 0 || b_val == 0) {
              return 0;
          } else {
              return a_val % b_val;
          }
      }
      
      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函数进行测试
          test_sorting(numbers, count, generic_sort, NULL); // 默认排序
          test_sorting(numbers, count, generic_sort, NULL, sorted_order); // 自然排序
          test_sorting(numbers, count, generic_sort, numbers, reverse_order); // 逆序排序
          test_sorting(numbers, count, generic_sort, (void*)&count, strange_order); // 奇特排序
      
          free(numbers);
      
          return 0;
      }
      

      在这个版本中,我们添加了一个名为generic_sort的新排序函数,它接受一个通用的比较函数作为参数。同时,我们修改了test_sorting函数,使其可以接受任意排序函数及可能的额外参数。这样,您可以在不修改主程序的情况下轻松地添加新的排序方法。注意,在strange_order函数中,我们传递了额外的整数计数器作为上下文数据,以便在排序过程中使用。

      回复
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    现代企业架构框架 — 业务架构
    MyBatis级联查询和缓存
    linux 启动springboot项目脚本
    字符串与字符编码 - GO语言从入门到实战
    SQL: 索引原理与创建索引的规范
    在CentOS上使用Gunicorn和systemd完整部署Flask应用:详细指南
    SELECT COUNT(*)会不会导致全表扫描引起慢查询
    java中的MVC设计模式、模型层 model 主要处理数据、视图层 view 显示数据、控制层 controller 处理业务逻辑
    文本分析总结
    不要使用短路逻辑编写 stl sorter 多条件比较
  • 原文地址:https://ask.csdn.net/questions/8103235