CIJUNBUGUILU 发表于 2024-10-22 23:51:32

C语言快速整理

跟着视频做的,为什么运行到调用快速整理函数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; // 以中间的数为比较的基准点

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

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

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

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

    return 0;
}


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

    int arr;

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

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


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

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

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

    return 0;
}

FishC 发表于 2024-10-22 23:55:49

你的代码存在几个问题,导致运行不正常。以下是一些关键问题和修正建议:

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

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

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

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

5. **访问数组元素问题**:
   - 排序过程中比较和交换数组元素时,访问方式需要修改为 `arr` 和 `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;

    while (i <= j)
    {
      while (arr < pivot) i++;
      while (arr > pivot) j--;

      if (i <= j)
      {
            temp = arr;
            arr = arr;
            arr = 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;

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

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

    sort_arr(arr, 0, num - 1);

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-10-23 08:58:11

本帖最后由 jackz007 于 2024-10-23 09:25 编辑

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

      // 从右到左找到小于基准点的数
      while (arr > pivot)
      {
            j ++      ; // 【错误】:应该是 j --
      }

CIJUNBUGUILU 发表于 2024-10-23 16:37:01

学太久了,老眼昏花,没看出来,真是麻烦你了

CIJUNBUGUILU 发表于 2024-10-23 16:37:30

谢谢
页: [1]
查看完整版本: C语言快速整理