关于#快速排列#的问题,如何解决?

快速排列小于5个数的时候都还可以,一旦大于5个数就没法运行成功。不是很理解

#include<stdio.h>
void quick_sort(int array[],int left,int right);
void quick_sort(int array[],int left,int right)
{
    int i = left,j = right;
    int temp;
    int pivot;
    
    pivot = array[(left + right/2)];
    
    while(i<=j)
    {
        while(array[i]<pivot)
        {
            i++;
        }
        while(array[j]>pivot)
        {
            j--;
        }
        if(i<=j)
        {
            temp=array[i];
            array[i]=array[j];
            array[j]=temp;
            i++;
            j--;
        }
    }
    if(left<j)
    {
        quick_sort(array,left,j);
    }
    if(i<right)
    {
        quick_sort(array,i,right);
    }
}
int main(void)
{
    int i,length,n;
    printf("请输入你想排列的数的个数n=");
    scanf("%d",&n);
    int array[n];
    for(i=0;i<n;i++)
    {
         printf("请输入第%d个数:\n",i+1);
         scanf("%d",&array[i]);
    }
    length = sizeof(array)/sizeof(array[0]);
    quick_sort(array,0,length-1);
    
    printf("排序后的结果是:\n");
    for(i=0;i<length;i++)
    {
        printf("%d",array[i]);
        putchar('\n');
    }
    
    
    return 0;
}

当n大于5时,length的计算结果就不正确了,length应该直接使用n,而不是通过sizeof计算,sizeof计算的是数组总的字节大小

img


代码
#

include<stdio.h>

void quick_sort(int array[], int left, int right); 

void quick_sort(int array[], int left, int right)
{
  int i = left, j = right;
  int temp;
  int pivot;
   
  pivot = array[(left + right) / 2];
   
  while (i <= j) {
    while(array[i] < pivot) {
      i++;
    }   
    while(array[j] > pivot) {
      j--;
    }
    if(i <= j) {
      temp = array[i];
      array[i] = array[j];
      array[j] = temp;
      i++;
      j--;
    }
  }
  
  if(left < j) {
    quick_sort(array, left, j);
  }
  if(i < right) { 
    quick_sort(array, i, right);
  }
}

int main(void) {  
  int i, n;
  printf("请输入个数n: ");
  scanf("%d", &n);  
  
  int array[n];
  for(i=0; i<n; i++){
    printf("请输入第%d个元素:", i+1);
    scanf("%d", &array[i]);
  }

  quick_sort(array, 0, n-1);  
  
  printf("排序后的数组: \n");
  for(i=0; i<n; i++){
     printf("%d ", array[i]);
  }

  return 0;
}

void quick_sort(int array[], int left, int right)
{
    int i = left, j = right;
    int temp;
    int pivot;

    pivot = array[(left + right) / 2];

    while (i <= j)
    {
        while (array[i] < pivot)
        {
            i++;
        }
        while (array[j] > pivot)
        {
            j--;
        }
        if (i <= j)
        {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
            i++;
            j--;
        }
    }
    if (left < j)
    {
        quick_sort(array, left, j);
    }
    if (i < right)
    {
        quick_sort(array, i, right);
    }
}

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7541562
  • 这篇博客你也可以参考下:单词排序:输入 5 个单词,将它们按从大到小的顺序排列后输出。
  • 除此之外, 这篇博客: 写一个扫雷小游戏中的         5.最最最重要的是搞清楚函数实参于形参 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  

     

  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 整个程序需要考虑的设计规范小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    根据参考资料里的代码,可以看出问题的解决办法是使用数组来存储需要排序的数字。但是参考资料中给出的代码只适用于排序不超过5个数的情况,当需要排序的数字超过5个时,就无法成功运行。为了解决这个问题,可以使用快速排序算法的递归实现。快速排序是一种常用且高效的排序算法,它通过选择一个基准元素,将数组分割成两部分,左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素,然后对左右两部分分别进行快速排序。下面是一个示例的快速排序函数实现:

    #include<stdio.h>
    
    // 交换两个元素的值
    void swap(int* a, int* b){
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    // 快速排序递归函数
    void quickSort(int arr[], int low, int high){
        if(low < high){
            int i = low, j = high, pivot = arr[low];
            while(i < j){
                while(i < j && arr[j] >= pivot) j--;
                if(i < j) swap(&arr[i++], &arr[j]);
                while(i < j && arr[i] <= pivot) i++;
                if(i < j) swap(&arr[i], &arr[j--]);
            }
            arr[i] = pivot;
            quickSort(arr, low, i - 1);
            quickSort(arr, i + 1, high);
        }
    }
    
    int main(){
        int n;
        scanf("%d", &n);
        int arr[n];
        for(int i=0; i<n; ++i){
            scanf("%d", &arr[i]);
        }
        quickSort(arr, 0, n - 1);
        for(int i=0; i<n; ++i){
            printf("%d ", arr[i]);
        }
        printf("\n");
        return 0;
    }
    

    这段代码实现了一个快速排序的函数quickSort,并在main函数中使用了这个函数来进行排序。其中,swap函数用于交换两个元素的值。quickSort函数接受一个需要排序的数组arr、数组的最低下标low和最高下标high作为参数,通过递归的方式进行快速排序。在main函数中,首先输入待排序的数字个数n,然后依次输入这n个数字,并调用quickSort函数进行排序,最后输出排序后的结果。

    这样就可以解决快速排列函数在排序超过5个数时无法成功运行的问题。