C++ 快速排序未正确排序数组

C++ Quick-sort is not sorting the array properly

本文关键字:排序 数组 快速排序 C++      更新时间:2023-10-16

你好,我得到了一个包含 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);
}

任何人都可以帮我解决这个问题吗?

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

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

改为:

q_n(array, 0, 9);

并且工作得很好。

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

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

其中 A 是一个 int 数组,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("%dn", A[i]);
    }
    return 0;
}