C语言:快速排序5个元素,但不排序10个元素

C语言:快速排序5个元素,但不排序10个元素,c,arrays,sorting,quicksort,C,Arrays,Sorting,Quicksort,我不明白为什么代码只对5个元素排序,而不对10个元素排序。在我与教授进行办公室访问期间,我向我介绍了这种方法。所以我按照他的指示编写代码。有人能帮我解决这个问题吗?我的代码可以工作,但在更大的数组上无法工作。我知道现在已经太晚了,没有人可以在到期之前提供帮助,但我只想了解我在这段代码中做了什么 多谢各位 /* Homework3.c Qucksort arrays Jared DaRocha 3/1/2020 */ #include <stdio.h>// preproces

我不明白为什么代码只对5个元素排序,而不对10个元素排序。在我与教授进行办公室访问期间,我向我介绍了这种方法。所以我按照他的指示编写代码。有人能帮我解决这个问题吗?我的代码可以工作,但在更大的数组上无法工作。我知道现在已经太晚了,没有人可以在到期之前提供帮助,但我只想了解我在这段代码中做了什么

多谢各位

/* Homework3.c
Qucksort arrays
Jared DaRocha
3/1/2020

 */


#include <stdio.h>// preprocessor 

int partition(int arr[], int first, int end);// function declaration

void quickSort(int arr[], int first, int end);// function declaration

int main(void)// beginning of main

{
    //Data
    int array[5];// creates an array of 5 elements
    int size = sizeof(array) / sizeof(array[0]); // calculates size of the array


    // prompt user to input data to input int the array
    printf("Enter 5 numbers to add in the array");
    // prompts user to input 10 numbers
    for(int i =0;i<size; i++)
    {
      scanf("%d", &array[i]);// stores user-defined data into the array
    }


    // call the function to sort the array
    quickSort(array, 0, size -1);


    // prints array 
    for (int i = 0; i < size; i++)
    {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}


int partition(int arr[], int low, int high)// Function declaration
{
    //Data
    int partition = arr[low]; // partition number


        // infinite for loop
        for (;;)
        {
          // decrement high while partition is smaller than element of high
            while(partition <arr[high]) 
            {

              high--;


            }


            // if partition is greater than element of high, swap high with low element since low element is the pivot
            if(partition > arr[high]){
              int temp = arr[low];

              arr[low] = arr[high];
              arr[high] = temp;
              low++;

            }           
            // increment low while partition is greater than element of low
            while(partition > arr[low])
            {

              low++;

            }

            // swap low and next element in the right if  partition is less than element of low
            if(partition < arr[low])
            {
              int temp = arr[low];
              arr[low] = arr[low+1];
              arr[low+1] = temp;
            }

            // if low is same as high then  exit loop
            if(high == low)
            {
              break;
            }


    }


    return low;
}

void quickSort(int arr[], int first, int end) // function definition
{
    if (first < end) 
    {
        int partitionIndex = partition(arr, first, end);
        quickSort(arr, first, (partitionIndex - 1));
        quickSort(arr, (partitionIndex+1 ), end);
    }
}

`

如果您检查快速排序算法,您将发现数组如何划分为两个不重叠的部分,但也不会留下一个元素。这样做,就在两个切片之间,只留下一个元素。将数组分成两个片和一个不参与对其他片的递归调用的数组元素。。。。这是不正确的。您知道的是,下位片的所有元素都小于标记,其余元素大于或等于标记。。。但分割点可以是对应的数组子部分的任何元素

顺便说一下,代码或分区是完全不正确的。您首先选择一个元素作为标记,您可以选择它作为数组的任何元素或作为所有元素的平均值,这并不重要。。。你不会把它放到数组中。然后从数组下的结束元素开始搜索,从令牌上的开始元素开始搜索,一旦有一对这样的元素,就切换它们,但将找到的元素与令牌交换,这不仅没有达到预期的效果,但是引入了令牌的副本并更改了它的值,这将破坏您的数组


您没有搜索数组元素。。。您正在搜索要分割数组的相邻元素之间的位置,子数组将从beg到pos-1,从pos到end,或从beg到pos,然后从pos+1到end,但不要忽略中心元素,因为您知道它属于一个数组,但是不需要标记。

这是应该能够对10个元素进行排序的代码还是原始的5元素版本?不清楚,因为它同时引用了5和10。显示的代码在多个地方有5作为幻数。请显示用于排序10的代码。如果这段代码在排序除5以外的任何其他数字时遇到问题,我并不感到惊讶,并将要求得到答案。我用10个元素对其进行了测试,并决定用5个元素进行测试。我忘了更改评论。我做了更多的测试,发现它只对奇数排序,对偶数不起作用