我正在尝试使用第一个元素作为枢轴实现快速排序分区算法,我已经研究了最后一个元素作为枢轴的Quicksort。有人可以告诉我下面的伪代码我错在哪里吗?
/* Taking first element of array as pivot and movig all elements
smaller than pivot left to pivot and greater tto its right */
// L is leftmost index, R is rightmost index
Partition(A[],L,R)
{
pivot = A[L]
i = L-1
for (j =L to R )
{
// If current element is smaller than or equal to pivot
if (A[j] <= pivot)
{
i++; // increment index of smaller element
swap A[i] and A[j]
}
}
swap A[i + 1] and A[L])
return (i + 1)
}
答案 0 :(得分:0)
经过一些试验和错误以及许多思考后,我发现了自己的错误。这是正确的算法。
Partition(A[],L,R)
{
pivot = A[L]
i = L
for (j =L+1 to R )
{
if (A[j] <= pivot)
{
i++; // increment index of smaller element
swap A[i] and A[j]
}
}
swap A[i] and A[L])
return (i)
}
答案 1 :(得分:0)
以下是“分区算法”的工作原理的简要概述: https://www.youtube.com/watch?v=MLpH7mpwOxQ
分区算法的目标是简单地获取一些元素集合(例如,您使用“数组”),然后围绕枢轴将这个集合划分(分为两个部分),即左部分和右部分
关于枢轴左侧和枢轴右侧的元素,应该有一些“规则”。例如,左侧的所有元素将小于所选的轴,而右侧的所有元素将大于轴。
希望这会有所帮助!
答案 2 :(得分:0)
@SiggiSv 根据您的答案,需要将“ R”加1,以便数组的最后一个元素也与数组一起排序,并且不会在您的代码之后被忽略
Partition(A[],L,R)
{
pivot = A[L]
i = L
for (j =L+1 to R+1 )
{
if (A[j] <= pivot)
{
i++; // increment index of smaller element
swap A[i] and A[j]
}
}
swap A[i] and A[L])
return (i)
}
答案 3 :(得分:0)
这是我在快速排序中使用的分区版本。 也适用于包含重复项的数组。 分区将枢轴(始终是第一个元素)放置在排序数组中的位置。假设左右枢轴的子数组已排序,工作完成。
int partition(int arr[],int p, int q) {
int i = p;
int j = q;
int pivot = arr[p]; //choose pivot to be a first element
while (i < j) {
for (; arr[i] < pivot; i++); //iterate from the beginning till an element is larger or equals to pivot
for (; arr[j] > pivot; j--); //iterate from the end till an element is less or equals to pivot
if(i < j) { //if both for loops are done, arr[i] >= pivot and needs to be
//on pivot's left. arr[j] <= pivot, so we throw it to pivot's right
if(arr[i] == arr[j])
i++; //taking care of duplicates
swap(arr[i], arr[j]);
}
}
cout << j<<endl; //now pivot is in its place as if array was sorted
return j; //all elements on j's left are smaller than all elements on j's right
}
void quicksort(int arr[], int p, int r)
{
if (p > r ) {
return;
}
int q = partition(arr, p, r);
quicksort(arr, p, q-1);
quicksort(arr, q+1, r);
}