C ++ Quick-sort不能正确排序数组

时间:2016-03-09 18:14:54

标签: c++ quicksort

你好我有一个包含10个元素的数组。 [0 ... 9]。 里面有数字 - [0,1,2,...,8,9]。 我正在尝试对数组进行降序排序,而不是[9,8,...,2,1]我得到[4 3 2 1 0 5 6 7 8 9]。

我的快速排序代码。

void q_n(int arr[], int left, int right) {
    int i = left, j = right;
    int tmp;
    int pivot = arr[(left + right) / 2];

    /* partition */
    while (i <= j) {
        while (arr[i] > pivot)
            i++;
        while (arr[j] < pivot)
            j--;
        if (i <= j) {
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    };

    /* recursion */
    if (left < j)
        q_n(arr, left, j);
    if (i < right)
        q_n(arr, i, right);
}

任何人都可以帮我这个吗? ; S

2 个答案:

答案 0 :(得分:0)

我发现了这个问题。如此愚蠢。不知道为什么会这样。 问题不在于qsort代码,而在于调用函数。

q_n(array, 0, sizeof(int));

更改为:

q_n(array, 0, 9);

并且工作得很好。

答案 1 :(得分:-3)

如果您不必实施快速排序,请使用内置的:

qsort(A, n, sizeof(int), compare_function);

其中Aint的数组,n是数组中元素的数量,您必须指定比较函数:

int compare_function(const void *ptr1, const void *ptr2)
{
    int tptr1 = *(int*)ptr1;
    int tptr2 = *(int*)ptr2;

    return tptr2 - tptr1;
}

使用return tptr1 - tptr2;升序,return tptr2 - tptr1;降序

编辑: 我只是复制粘贴了以前的代码,并没有注意到int-float错误。以下是qsort如何适用于想要使用它的人的完整示例:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int compare_function(const void *a, const void *b)
{
    return *(int*)a - *(int*)b; //ascending
    //return *(int*)b - *(int*)a; //descending
}

int main()
{
    int A[100];
    srand(time(NULL));
    for(int i=0; i<100; ++i)
    {
        A[i] = rand();
    }

    qsort(A, 100, sizeof(int), compare_function);

    for(int i=0; i<100; ++i)
    {
        printf("%d\n", A[i]);
    }
    return 0;
}