C++ C++;带指针的快速排序
有人能指出我代码中的错误吗?很抱歉误导了函数参数的名称-rptr应该是右值或其他一些东西,我一直在更改某些东西。 大部分操作都应该使用指针来完成。 我认为错误可能在partArr中,返回无效变量,但我真的不知道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
#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);