使用递归快速排序分而治之算法时,如何对枢轴的右侧进行分区?

发布于 2025-01-12 00:51:28 字数 1158 浏览 0 评论 0原文

我有以下问题,我正在尝试实现快速排序算法中的第一个分区步骤,我只需要使用 fastSortDivide 函数的两个参数(数组和大小)。我已经能够对数组的左侧进行排序并返回递归调用的枢轴索引。但是,我的问题是,在枢轴的右侧,我无法对该分区进行排序,因为我无法从返回的索引中找到最右边的墙。我希望这是有道理的,请找到下面的代码:

void quickSort(int arr[], int size) {


    if (size > 1) {
        
        int index = quickSortDivide(arr, size);
        std::cout << "in recursion:  " <<index <<endl;
        quickSort(arr, index-1);
        quickSort(arr, index +1);
        
    }
 

}



int quickSortDivide(int* arr, int size)
{
    

    int pivot = arr[size - 1], current, index = 0;
    cout << " piv: " << pivot <<  endl;

    for (int i = index; i < size; i++)
    {

        if (arr[i] > pivot) {
            for (int j = i; j < size; j++)
            {

                if (arr[j] < pivot) {
                   
                    index = i;
                    swapInArray(arr, i, j);

                }
            }
        }
 
    }
    swapInArray(arr, index + 1, size-1 );
    
    return index;
}

输出:

before function call { 14, 3, 1, 9, 7, 45, 10};


after function call: {1 3 7 9 10 45 14}

I have the following issue, I am trying to implement the first partition step in the quick sort algorithm, I need to use only two arguments for the quickSortDivide function (array and size). I am have been able to sort the left side of the array and return the index of pivot for the recursive call. However, my problem is that on the right side of the pivot I am not able to sort that partition because I am not able to find the right most wall from the returned index. I hope that makes sense, please find the code below:

void quickSort(int arr[], int size) {


    if (size > 1) {
        
        int index = quickSortDivide(arr, size);
        std::cout << "in recursion:  " <<index <<endl;
        quickSort(arr, index-1);
        quickSort(arr, index +1);
        
    }
 

}



int quickSortDivide(int* arr, int size)
{
    

    int pivot = arr[size - 1], current, index = 0;
    cout << " piv: " << pivot <<  endl;

    for (int i = index; i < size; i++)
    {

        if (arr[i] > pivot) {
            for (int j = i; j < size; j++)
            {

                if (arr[j] < pivot) {
                   
                    index = i;
                    swapInArray(arr, i, j);

                }
            }
        }
 
    }
    swapInArray(arr, index + 1, size-1 );
    
    return index;
}

Output:

before function call { 14, 3, 1, 9, 7, 45, 10};


after function call: {1 3 7 9 10 45 14}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

两仪 2025-01-19 00:51:28

有多种方法可以处理这些参数,但我建议这样做:

int index = quickSortDivide(arr, size);
std::cout << "in recursion:  " << index <<endl;
quickSort(arr, index++);
quickSort(arr + index, size - index));

后增量跳过枢轴位置,第二个递归在该跳过之后重新设置“数组”起始地址的基址,将段大小减小为余数此后的部分。

注意:我仍然在您的实现中发现至少还有一个错误,但这需要您去发现。

There are a number of ways you can juggle the arguments, but I suggest this:

int index = quickSortDivide(arr, size);
std::cout << "in recursion:  " << index <<endl;
quickSort(arr, index++);
quickSort(arr + index, size - index));

The post-increment skips past the pivot location, and the second recursion rebases the "array" starting address after that skip, reducing the segment size to be the remainder of the segment thereafter.

Note: I still see at least one more bug in your implementation, but that's for you to find.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文