快速排列小于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计算的是数组总的字节大小
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);
}
}
问题解答:
根据参考资料里的代码,可以看出问题的解决办法是使用数组来存储需要排序的数字。但是参考资料中给出的代码只适用于排序不超过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个数时无法成功运行的问题。