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

C++ C++;带指针的快速排序,c++,algorithm,pointers,quicksort,C++,Algorithm,Pointers,Quicksort,有人能指出我代码中的错误吗?很抱歉误导了函数参数的名称-rptr应该是右值或其他一些东西,我一直在更改某些东西。 大部分操作都应该使用指针来完成。 我认为错误可能在partArr中,返回无效变量,但我真的不知道 #include <iostream> const int ArSize = 10; void swap(int *lptr, int *rptr) { int tempV = *lptr; *lptr = *rptr; *rptr = t

有人能指出我代码中的错误吗?很抱歉误导了函数参数的名称-rptr应该是右值或其他一些东西,我一直在更改某些东西。 大部分操作都应该使用指针来完成。 我认为错误可能在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;
}
#包括
常数int ArSize=10;
无效交换(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){
而(arr[*rightP]>=pivot)--(*rightP);
while(arr[*leftP]*leftP){
交换(leftP,rightP);
--(*右图);
++(*左P);
}
否则{
返回rptr;
}
}
}
无效快速排序(int*arr、int-ptrL、int-ptrR){
如果(ptrR>ptrL){
int arr_piv=部分arr(arr、ptrL、ptrR);
快速排序(arr、ptrL、arr_piv-1);
快速排序(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];
快速排序(选项卡、ptrL、ptrR);
用于(int x:tab)
std::cout这里

获取函数参数的地址。当调用

swap(leftP,rightP);
然后在编写时交换
lptr
rptr
的值

--(*rightP)
您减少了
rptr
的值。您从未实际修改数组的元素

我没有CS学位,因此当我想对数组排序时,我使用:

#包括
#包括
#包括
int main(){
int tab[]={10,40,30,4,3,312,3,4,1};
std::sort(std::begin(tab),std::end(tab));
用于(int&x:tab)

std::cout使用指针的快速排序不需要将数组名称作为参数传递。示例代码:

void QuickSort(int *lo, int *hi)
{
int *i, *j;
int p, t;
    if(lo >= hi)
        return;
    p = *(lo + (hi-lo)/2);
    i = lo - 1;
    j = hi + 1;
    while (1){
        while (*(++i) < p);
        while (*(--j) > p);
            if (i >= j)
                break;
            t = *i;
            *i = *j;
            *j = t;
    }
    QuickSort(lo, j);
    QuickSort(j+1, hi);
}

问题是什么?你怎么知道代码有问题?有错误吗?输出错误?你在使用调试器时发现了什么?是的,我应该提到,数组的顺序根本没有改变,我目前无法使用调试器。为什么你无法使用调试器?将索引变量命名为“lptr”和“rptr”是令人困惑的。它们不是指针,它们存储的位置完全不相关。我使用的不是我的计算机,而且我认为这里的错误非常明显,所以我作为一个彻头彻尾的傻瓜看不出来。我只是很好奇那里出了什么问题。非常感谢,是的,我将使用调试器来处理它p我可以。@Mac也可以看到最后一次编辑。实现合并排序对于算法的实践是很好的,但您也应该学习使用可用的工具。我知道std::sort,我只是想更好地理解排序算法是如何工作的,但还是要感谢您。
#include <algorithm>
#include <iostream>
#include <iterator>
int main() {
    int tab[] = {10, 40, 30, 4, 3, 312, 3, 4, 1};  

    std::sort( std::begin(tab), std::end(tab));

    for (int& x : tab)
        std::cout << x << " ";
    return 0;
}
void QuickSort(int *lo, int *hi)
{
int *i, *j;
int p, t;
    if(lo >= hi)
        return;
    p = *(lo + (hi-lo)/2);
    i = lo - 1;
    j = hi + 1;
    while (1){
        while (*(++i) < p);
        while (*(--j) > p);
            if (i >= j)
                break;
            t = *i;
            *i = *j;
            *j = t;
    }
    QuickSort(lo, j);
    QuickSort(j+1, hi);
}
QuickSort(array, array+(sizeof(array)/sizeof(array[0]))-1);