Quicksort程序没有对数组进行排序

时间:2014-03-09 12:47:03

标签: c quicksort

我还不知道代码有什么问题:

#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功能,选择支点。

2 个答案:

答案 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;
}

它仅交换指针xy本身的值,而不是xy指向的值。请记住,C中的函数始终是按值传递的。您需要交换*x*y

void swap(int *x, int *y)
{
    int tmp;
    tmp = x;
    *x = *y;
    *y = tmp;
}