带有指针的C ++快速排序

问题描述 投票:-1回答:1

有人可以指出我的代码中的错误吗?抱歉,函数参数的名称具有误导性-rptr应该是rvalue或诸如此类,我一直在不断更改。大多数应该使用指针来完成。我认为错误可能出在partArr,返回无效变量,但我真的不知道。

#include <iostream>

const int ArSize = 10;

void swap(int *lptr, int *rptr) {
    int tempV = *lptr;
    *lptr = *rptr;    
    *rptr = tempV;
}

int partArr(int *arr, int lptr, int rptr) {
    int pivot = (lptr + rptr) / 2;
    int * leftP = &lptr;
    int * rightP = &rptr;

    while (true) {
        while (arr[*rightP] >= pivot) --(*rightP);
        while (arr[*leftP] <= pivot)  ++(*leftP);
        if(*rightP > *leftP) {
            swap(leftP,rightP);
            --(*rightP);
            ++(*leftP);
        }
        else {
            return rptr;
        }
    }
}

void quickSort(int *arr, int ptrL, int ptrR) {
    if (ptrR > ptrL) { 
        int arr_piv = partArr(arr, ptrL, ptrR);    
        quickSort(arr, ptrL, arr_piv - 1);    
        quickSort(arr,arr_piv+1,ptrR);
    }
}

int main() {
    int tab[ArSize] = {10, 40, 30, 4, 3, 312, 3, 4, 1};  
    int ptrL = tab[0];    
    int ptrR = tab[ArSize - 1];
    quickSort(tab, ptrL, ptrR);
    for (int x : tab)
        std::cout << x << " ";
    return 0;
}
c++ algorithm pointers quicksort
1个回答
1
投票

这里

int * leftP = &lptr;
int * rightP = &rptr;

您获取函数参数的地址。致电时

swap(leftP,rightP);

然后交换lptrrptr的值。当你写

--(*rightP)

您递减rptr的值。您实际上从未修改过数组的元素。

我没有CS学历,因此,当我想对数组进行排序时,我使用std::sort。如果您需要自己练习将其实现,则应该学习如何使用调试器,否则您将始终遇到类似这样的问题。在编码方面变得更好并不是要避免犯错误,而是要知道如何解决错误。

© www.soinside.com 2019 - 2024. All rights reserved.