2301_79864519 2023-10-21 08:31 采纳率: 94.7%
浏览 6
已结题

快速排序的问题,不能从大到小

不能实现既可以从小到大又从大到小输出
代码如下:
#include <stdio.h> //定义一个数组,能够输入任意个整型数字,输入回车时停止输入数字,并且输入1时将数字从小到大排序,输入2时将他们从大到小排序。实现快速排序算法对一个整数数组进行从小到大排或从大到小排序。
#include<stdlib.h> //<stdlib.h>头文件中的函数在快速排序算法中起到了随机生成基准元素的作用,提高快排的性能。

void quickSort(int arr[], int left, int right) {
if (left >= right) {
return;
}

int pivot = arr[left];    //先将数组的第一个元素作为基准值(即枢轴值) pivot,边界不用定义
int i = left + 1;
int j = right;

while (i <= j) {
    if (arr[i] > pivot && arr[j] < pivot) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;    //调换
        i++;
        j--;
    } else if (arr[i] <= pivot) {           //快速排序的思想是将数组划分为两个子数组,一个小于基准值的子数组和一个大于基准值的子数组,然后递归地对这两个子数组进行排序。
        i++;
    } else if (arr[j] >= pivot) {
        j--;
    }
}

arr[left] = arr[j];
arr[j] = pivot;

quickSort(arr, left, j - 1);       //快速排序
quickSort(arr, j + 1, right);

}

int main() {
int arr[100];
int num, count = 0;
int choice;

printf("请输入任意个整数(以回车结束):\n");

do {           //逐个接收用户输入的整数,并存储到数组 arr 中,同时记录输入的个数 count。直到遇到回车符或者数组达到最大长度
    scanf("%d", &num);
    arr[count++] = num;
} while (getchar() != '\n' && count < 100);

printf("输入 1 表示从小到大排序,输入 2 表示从大到小排序:");
scanf("%d", &choice);

if (choice == 1) {
    quickSort(arr, 0, count - 1);            //表示待排序数组的最后一个元素的索引

    printf("排序后的数组为:");
       for (int i = 0; i < count; i++) {
           printf("%d", arr[i]);
          if (i != count - 1) {            //格式
               printf(", ");
          }
    }
    printf("\n");
} else if (choice == 2) {
    quickSort(arr,0,count-1); 

    printf("排序后的数组为:");
    for (int i = 0; i < count; i++) {
           printf("%d", arr[i]);
          if (i != count - 1) {           
               printf(", ");
           }
   }
    printf("\n");
}else {
    printf("无效的选择!\n");
}

return 0;

}
请大家修正一下,急

  • 写回答

3条回答 默认 最新

  • Stephen_112 2023-10-21 10:06
    关注

    输出从大到小或者从小到大,其实就是将排序好的数组从前遍历还是从后遍历的问题。

    
    #include <stdio.h> //定义一个数组,能够输入任意个整型数字,输入回车时停止输入数字,并且输入1时将数字从小到大排序,输入2时将他们从大到小排序。实现快速排序算法对一个整数数组进行从小到大排或从大到小排序。
    #include<stdlib.h> //<stdlib.h>头文件中的函数在快速排序算法中起到了随机生成基准元素的作用,提高快排的性能。
    
    void quickSort(int arr[], int left, int right) {
        if (left >= right) {
            return;
        }
    
        int pivot = arr[left];    //先将数组的第一个元素作为基准值(即枢轴值) pivot,边界不用定义
        int i = left + 1;
        int j = right;
    
        while (i <= j) {
            if (arr[i] > pivot && arr[j] < pivot) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;    //调换
                i++;
                j--;
            }
            else if (arr[i] <= pivot) {           //快速排序的思想是将数组划分为两个子数组,一个小于基准值的子数组和一个大于基准值的子数组,然后递归地对这两个子数组进行排序。
                i++;
            }
            else if (arr[j] >= pivot) {
                j--;
            }
        }
    
        arr[left] = arr[j];
        arr[j] = pivot;
    
        quickSort(arr, left, j - 1);       //快速排序
        quickSort(arr, j + 1, right);
    }
    
    int main() {
        int arr[100];
        int num, count = 0;
        int choice;
        printf("请输入任意个整数(以回车结束):\n");
    
        do {           //逐个接收用户输入的整数,并存储到数组 arr 中,同时记录输入的个数 count。直到遇到回车符或者数组达到最大长度
            scanf_s("%d", &num);
            arr[count++] = num;
        } while (getchar() != '\n' && count < 100);
    
        printf("输入 1 表示从小到大排序,输入 2 表示从大到小排序:");
        scanf_s("%d", &choice);
    
        if (choice == 1) {
            quickSort(arr, 0, count - 1);            //表示待排序数组的最后一个元素的索引
    
            printf("排序后的数组为:");
            for (int i = 0; i < count; i++) {
                printf("%d", arr[i]);
                if (i != count - 1) {            //格式
                    printf(", ");
                }
            }
            printf("\n");
        }
        else if (choice == 2) {
            quickSort(arr, 0, count - 1);
    
            printf("排序后的数组为:");
            for (int i = count-1; i >= 0; i--) {
                printf("%d", arr[i]);
                if (i != 0) {
                    printf(", ");
                }
            }
            printf("\n");
        }
        else {
            printf("无效的选择!\n");
        }
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月21日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境