returns 个原始值的快速排序实现
quicksort implementation that returns original values
所以我尝试实现快速排序算法,但事情是这样的,因为我在调试器中跟踪代码,所有元素都按排序顺序排列,但是,该算法取消了之后的一些三个递归调用中的所有内容元素被排序。请告诉我出了什么问题
#include <iostream>
#include <vector>
using namespace std;
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
void quicksort(vector<int> A, int start, int end)
{
if (start < end)
{
int pivot = A[start];
int i, j = start;
for (i = start + 1;i < end;i++)
{
if (pivot>A[i])
{
swap(A[i], A[j + 1]);
j++;
}
}
swap(A[start], A[j]);
quicksort(A, start, j - 1);
quicksort(A, j + 1, end);
}
}
int main()
{
vector<int> A = { 2,8,7,1,3,5,6,4 };
quicksort(A, 0, A.size());
for (int i = 0; i < A.size(); i++)
cout << A[i] << endl;
return 0;
}
您正在将向量的副本传递给函数。
您需要一个参考参数,就像您对 swap
所做的那样:
void quicksort(vector<int>& A, int start, int end)
(顺便说一下,swap
在标准库中。)
快速浏览后,我发现了以下内容:
您需要将矢量作为 参考 传递。请记住,quicksort 中变量的生命周期只是暂时的(直到函数结束)。
void quicksort(vector<int>& A, int start, int end)
我也改了
quicksort(A, start, j -1 );
quicksort(A, j + 1, end);
到
quicksort(A, start, j );
quicksort(A, j + 1, end);
因为你好像跳过了A[j]。
我认为它现在有效。您的主要问题是通过引用传递向量。
所以我尝试实现快速排序算法,但事情是这样的,因为我在调试器中跟踪代码,所有元素都按排序顺序排列,但是,该算法取消了之后的一些三个递归调用中的所有内容元素被排序。请告诉我出了什么问题
#include <iostream>
#include <vector>
using namespace std;
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
void quicksort(vector<int> A, int start, int end)
{
if (start < end)
{
int pivot = A[start];
int i, j = start;
for (i = start + 1;i < end;i++)
{
if (pivot>A[i])
{
swap(A[i], A[j + 1]);
j++;
}
}
swap(A[start], A[j]);
quicksort(A, start, j - 1);
quicksort(A, j + 1, end);
}
}
int main()
{
vector<int> A = { 2,8,7,1,3,5,6,4 };
quicksort(A, 0, A.size());
for (int i = 0; i < A.size(); i++)
cout << A[i] << endl;
return 0;
}
您正在将向量的副本传递给函数。
您需要一个参考参数,就像您对 swap
所做的那样:
void quicksort(vector<int>& A, int start, int end)
(顺便说一下,swap
在标准库中。)
快速浏览后,我发现了以下内容:
您需要将矢量作为 参考 传递。请记住,quicksort 中变量的生命周期只是暂时的(直到函数结束)。
void quicksort(vector<int>& A, int start, int end)
我也改了
quicksort(A, start, j -1 );
quicksort(A, j + 1, end);
到
quicksort(A, start, j );
quicksort(A, j + 1, end);
因为你好像跳过了A[j]。 我认为它现在有效。您的主要问题是通过引用传递向量。