我还不知道代码有什么问题:
#include <stdio.h>
#define cutoff 3
int swap(int *x, int *y)
{
int *tmp;
tmp = x;
x = y;
y = tmp;
return *x, *y;
}
void qsort(int a[], int left, int right)
{
int i, j;
int pivot;
if (left + cutoff <= right) // JUST TO ENSURE THAT THE ARRAY'S SIZE IS >= CUTOFF.
{
pivot = median(a, left, right);
i = left;
j = right - 1;
for (;;)
{
while (a[i] < pivot)
i++;
while (a[j] > pivot)
j--;
if (i < j)
swap(&a[i], &a[j]);
else
break;
}
swap(&a[i], &a[right - 1]); // RESTORE PIVOT
qsort(a, left, i-1);
qsort(a, i+1, right);
}
//else
// PERFORM INSERTION SORT
}
void quicksort(int a[], int n)
{
int i;
qsort(a, 0, n - 1);
printf("THE SORTED ARRAY IS: ");
for(i=0;i<n;i++)
printf("%d ", a[i]);
}
int median(int a[], int left, int right)
{
int center = (left + right) / 2;
if(a[left] > a[center])
swap(&a[left], &a[center]);
if(a[left] > a[right])
swap(&a[left], &a[right]);
if(a[center] > a[right])
swap(&a[center], &a[right]);
swap(&a[center], &a[right - 1]); // HIDE PIVOT.
return a[right - 1]; // RETURN PIVOT.
}
void main()
{
int a[100], i, n;
printf("ENTER THE SIZE: ");
scanf("%d", &n);
printf("ENTER THE UNSORTED ARRAY: ");
for (i=0;i<n;i++)
scanf("%d", &a[i]);
quicksort(a, n);
}
输出与输入相同,因此输出大小超过输入大小。我认为问题在于median
功能,选择支点。
答案 0 :(得分:2)
int swap(int *x, int *y)
{
int *tmp;
tmp = x;
x = y;
y = tmp;
return *x, *y;
}
您正在分配指针,而不是它们的值。请改用
void swap(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
此外,返回意味着什么,因为指针交换了值,并且您一次也不能返回2个值。返回类型应该像@Yu Hao所说的那样无效
答案 1 :(得分:1)
主要问题在于您的swap()
功能
int swap(int *x, int *y)
{
int *tmp;
tmp = x;
x = y;
y = tmp;
return *x, *y;
}
它仅交换指针x
和y
本身的值,而不是x
和y
指向的值。请记住,C中的函数始终是按值传递的。您需要交换*x
和*y
。
void swap(int *x, int *y)
{
int tmp;
tmp = x;
*x = *y;
*y = tmp;
}