C++ 带指针的快速排序
C++ quicksort with pointers
有人可以指出我代码中的错误吗?抱歉误导函数参数的名称 - 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 * leftP = &lptr;
int * rightP = &rptr;
你取函数参数的地址。当你打电话时
swap(leftP,rightP);
然后交换 lptr
和 rptr
的值。当你写
--(*rightP)
你减少了 rptr
的值。您永远不会真正修改数组的元素。
我没有 CS 学位,因此当我想对数组进行排序时,我使用 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);
有人可以指出我代码中的错误吗?抱歉误导函数参数的名称 - 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 * leftP = &lptr;
int * rightP = &rptr;
你取函数参数的地址。当你打电话时
swap(leftP,rightP);
然后交换 lptr
和 rptr
的值。当你写
--(*rightP)
你减少了 rptr
的值。您永远不会真正修改数组的元素。
我没有 CS 学位,因此当我想对数组进行排序时,我使用 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);