鱼C论坛

 找回密码
 立即注册
查看: 405|回复: 4

[已解决]C语言快速整理

[复制链接]
发表于 2024-10-22 23:51:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
跟着视频做的,为什么运行到调用快速整理函数sort_arr时,就停止运行了?


#include <stdio.h>

int sort_arr(int arr[], int L, int R)
{
    int i = L;
    int j = R;
    int a = (L + R) / 2;
    int temp;           // 用于互换的中间变量
    int pivot = arr[a]; // 以中间的数为比较的基准点

    while (i <= j)
    {
        // 从左到右找到大于基准点的数
        while (arr[i] < pivot)
        {
            i++;
        }

        // 从右到左找到小于基准点的数
        while (arr[j] > pivot)
        {
            j++;
        }

        /* 如果当前位置满足arr[i] pivot arr[j],则arr[i] arr[j]互换位置*/
        if (i <= j)
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    /* 当j>i时,说明基准点前后的数字已经全部被i和j检索了一遍*/

    /* 如果j还没有检索最左边,则再将arr[最左]到arr[j]为一组,再排一次*/
    if (L < j)
    {
        sort_arr(arr, L, j);
    }
    /* 如果i还没有检索最右边,则再将arr[i]到arr[最右]为一组,再排一次*/
    if (i < R)
    {
        sort_arr(arr, i, R);
    }
    // 每次根据基准点排序时都保证了左边总是小于右边

    return 0;
}


int main()
{
    int num;
    printf("要输入的整数个数:");
    scanf("%d", &num);
    getchar();

    int arr[num];

    for (int i = 0; i < num; i++)
    {
        printf("请输入第%d个数字:", i + 1);
        scanf("%d", &arr[i]);
        getchar();
    }

    for (int i = 0; i < num; i++)
    {
        printf("%d ", arr[i]);
    }


    sort_arr(arr, 0, (num - 1));

    printf("\n排序后打印:\n");

    for (int i = 0; i < num; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}
最佳答案
2024-10-23 08:58:11
本帖最后由 jackz007 于 2024-10-23 09:25 编辑

        代码有一处错误:
  1.         // 从左到右找到大于基准点的数
  2.         while (arr[i] < pivot)
  3.         {
  4.             i ++        ;
  5.         }

  6.         // 从右到左找到小于基准点的数
  7.         while (arr[j] > pivot)
  8.         {
  9.             j ++        ; // 【错误】:应该是 j --
  10.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-22 23:55:49 | 显示全部楼层
你的代码存在几个问题,导致运行不正常。以下是一些关键问题和修正建议:

1. **数组声明问题**:
   - `int arr;` 声明应该是一个数组,例如 `int arr[num];`。

2. **函数参数问题**:
   - `int sort_arr(int arr, int L, int R)` 中的 `arr` 应为指针形式 `int *arr`。

3. **基准点选择问题**:
   - `int pivot = arr;` 应该是 `int pivot = arr[a];`。

4. **输入输出问题**:
   - 你在填充数组时,只填充了一个元素。

5. **访问数组元素问题**:
   - 排序过程中比较和交换数组元素时,访问方式需要修改为 `arr[i]` 和 `arr[j]`。

以下是修改后的代码:

  1. #include <stdio.h>

  2. int sort_arr(int *arr, int L, int R)
  3. {
  4.     int i = L;
  5.     int j = R;
  6.     int a = (L + R) / 2;
  7.     int temp;           
  8.     int pivot = arr[a];

  9.     while (i <= j)
  10.     {
  11.         while (arr[i] < pivot) i++;
  12.         while (arr[j] > pivot) j--;

  13.         if (i <= j)
  14.         {
  15.             temp = arr[i];
  16.             arr[i] = arr[j];
  17.             arr[j] = temp;
  18.             i++;
  19.             j--;
  20.         }
  21.     }

  22.     if (L < j)
  23.     {
  24.         sort_arr(arr, L, j);
  25.     }
  26.     if (i < R)
  27.     {
  28.         sort_arr(arr, i, R);
  29.     }
  30.     return 0;
  31. }

  32. int main()
  33. {
  34.     int num;
  35.     printf("要输入的整数个数:");
  36.     scanf("%d", &num);

  37.     int arr[num];

  38.     for (int i = 0; i < num; i++)
  39.     {
  40.         printf("请输入第%d个数字:", i + 1);
  41.         scanf("%d", &arr[i]);
  42.     }

  43.     printf("排序前:\n");
  44.     for (int i = 0; i < num; i++)
  45.     {
  46.         printf("%d ", arr[i]);
  47.     }
  48.     printf("\n");

  49.     sort_arr(arr, 0, num - 1);

  50.     printf("排序后:\n");
  51.     for (int i = 0; i < num; i++)
  52.     {
  53.         printf("%d ", arr[i]);
  54.     }
  55.     printf("\n");

  56.     return 0;
  57. }
复制代码


上述代码修正了所有的关键问题,并且可以正确进行快速排序。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-23 08:58:11 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-10-23 09:25 编辑

        代码有一处错误:
  1.         // 从左到右找到大于基准点的数
  2.         while (arr[i] < pivot)
  3.         {
  4.             i ++        ;
  5.         }

  6.         // 从右到左找到小于基准点的数
  7.         while (arr[j] > pivot)
  8.         {
  9.             j ++        ; // 【错误】:应该是 j --
  10.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-23 16:37:01 From FishC Mobile | 显示全部楼层
学太久了,老眼昏花,没看出来,真是麻烦你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-23 16:37:30 From FishC Mobile | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表