鱼C论坛

 找回密码
 立即注册
查看: 229|回复: 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 编辑

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

        // 从右到左找到小于基准点的数
        while (arr[j] > pivot)
        {
            j ++        ; // 【错误】:应该是 j --
        }
想知道小甲鱼最近在做啥?请访问 -> 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]`。

以下是修改后的代码:
#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--;

        if (i <= j)
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }

    if (L < j)
    {
        sort_arr(arr, L, j);
    }
    if (i < R)
    {
        sort_arr(arr, i, R);
    }
    return 0;
}

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

    int arr[num];

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

    printf("排序前:\n");
    for (int i = 0; i < num; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    sort_arr(arr, 0, num - 1);

    printf("排序后:\n");
    for (int i = 0; i < num; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

        // 从右到左找到小于基准点的数
        while (arr[j] > pivot)
        {
            j ++        ; // 【错误】:应该是 j --
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-23 16:37:01 From FishC Mobile | 显示全部楼层
学太久了,老眼昏花,没看出来,真是麻烦你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-23 16:37:30 From FishC Mobile | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 02:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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