提问人:o.ayden76 提问时间:3/21/2023 更新时间:3/22/2023 访问量:56
如何在快速排序算法中实现 medianOf3
How to implement medianOf3 in quicksort algorithm
问:
我正在尝试使用快速排序算法实现此 medianOf3 方法;但是,我所做的一切都不起作用。我知道我的快速排序方法正在工作,但是我的分区方法无法正确分区,如果有人对使用我的快速排序算法实现此 medianOf3 方法有任何建议,那将是非常有帮助的。此外,我还包含了 <bits/stdc++.h>、 、 和 包括 .我使用 std::swap 添加;并使用命名空间 std;也。
template<typename T> inline
int medianOf3(T A[], int l, int r){
//this is overcommented... also, try and avoid using pointers
T* a = A + l;//array name is just pointer to 1st (0 index) elem., + l shifts l*(T size)
T* b = A + l + (r-l)/2;//middle item... int division rounds down
T* c = A + r;
//when a is a pointer, *a is the dereference operator (gives value a points to)
T* m;
if(*a < *b){
if(*b < *c) m=b;
else if(*c < *a) m=a;
else m=c;
} else{ //b <=a8
if(*a < *c) m=a;
else if(*c < *b) m=b;
else m=c;
}
return m-A; //m-A is the number of elements from A[0]
}
int partition(int a[], int l, int r){
int s = medianOf3(a, l, r);
swap(a[l], s);
int p = a[l];
int i = l;
int j = r;
while(i<j){
do{
i=i+1;
}while(a[i]<=p);
do{
j=j-1;
}while(a[j]>p);
if (i<j)
swap(a[i], a[j]);
}
swap(a[l], a[j]);
return j;
}
void quickSort(int arr[], int l, int r){
if (l < r){
int p = partition(arr, l, r);
quickSort(arr, l, p - 1);
quickSort(arr, p + 1, r);
}
}
答:
0赞
rcgldr
3/21/2023
#1
partition()
是实现 Hoare 分区方案的尝试,但存在一些问题。下面是一个工作示例:
int medianof3(int a[], int lo, int hi)
{
int md = lo+(hi-lo)/2; // median of 3
if(a[lo] > a[hi])
std::swap(a[lo], a[hi]);
if(a[lo] > a[md])
std::swap(a[lo], a[md]);
if(a[md] > a[hi])
std::swap(a[md], a[hi]);
return md;
}
int partition(int a[], int lo, int hi)
{
int md = medianof3(a, lo, hi); // median of 3
int p = a[md]; // Hoare partition
int i = lo - 1;
int j = hi + 1;
while (1){
while (a[++i] < p);
while (a[--j] > p);
if (i >= j)
break;
std::swap(a[i], a[j]);
}
return j; // return index to split point
}
void quicksort(int a[], int lo, int hi)
{
if(lo >= hi) // return if nothing to do
return;
int s = partition(a, lo, hi); // partition
quicksort(a, lo, s); // recurse
quicksort(a, s+1, hi);
}
所有这些都可以包含在快速排序功能中
void quicksort(int a[], int lo, int hi)
{
if(lo >= hi) // return if nothing to do
return;
int md = lo+(hi-lo)/2; // median of 3
if(a[lo] > a[hi])
std::swap(a[lo], a[hi]);
if(a[lo] > a[md])
std::swap(a[lo], a[md]);
if(a[md] > a[hi])
std::swap(a[md], a[hi]);
int p = a[md]; // Hoare partition
int i = lo - 1;
int j = hi + 1;
while (1){
while (a[++i] < p);
while (a[--j] > p);
if (i >= j)
break;
std::swap(a[i], a[j]);
}
quicksort(a, lo, j); // recurse
quicksort(a, j+1, hi);
}
评论
medianOf3
return m-A
swap(a[l], s);