就地随机选择算法
In place randomized selection algorithm
我们目前正在研究算法,因此我将这个问题标记为"作业",尽管这不是一个与作业相关的任务。只是为了安全。
我们刚刚研究了随机选择算法,逻辑似乎很简单。从列表中选择一个元素,然后将该元素放在正确的位置。然后在一个子列表中重复该过程,直到索引处的元素就位。其中index是所需元素在排序列表中的位置。
这应该是快速排序算法的修改版本。但我们只对一个子列表进行排序,而不是对两个子列表都进行排序。因此,性能得到了提升(大哦)。
我可以使用外部存储(C++和基于零的数组)成功地实现此算法:
int r_select2(vector<int>& list, int i)
{
int p = list[0];
vector<int> left, right;
for (int k = 1; k < list.size(); ++k)
{
if (list[k] < p) left.push_back(list[k]);
else right.push_back(list[k]);
}
int j = left.size();
if (j > i) p = r_select2(left, i);
else if (j < i) p = r_select2(right, i - j - 1);
return p;
}
然而,我想使用原位(就地)实现算法,而不是使用额外的子数组。我认为这应该是一项简单/琐碎的任务。但在某些地方,我的原位版本出错了。也许只是太晚了,我需要睡觉,但我看不出以下版本失败的根本原因:
int r_select(vector<int>& list, int begin, int end, int i)
{
i = i + begin;
int p = list[begin];
if (begin < end)
{
int j = begin;
for (int k = begin + 1; k < end; ++k)
{
if (list[k] < p)
{
++j;
swap(list[j], list[k]);
}
}
swap(list[begin], list[j]);
if (j > i) p = r_select(list, begin, j, i);
else if (j < i) p = r_select(list, j + 1, end, i - j);
}
return p;
}
在这两个例子中,第一个元素被用作枢轴,以保持设计简单。在这两个示例中,i
都是我想要的元素的索引。
有没有第二个例子失败的地方?这是一个简单的一次失误吗?
谢谢大家!
这听起来很可疑:
i = i + begin;
...
r_select(list, begin, j, i);
相关文章:
- C++选择排序算法中的逻辑错误
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 选择排序算法生成无序结果
- std::stable_sort: 如何选择内存优化算法而不是时间优化算法?
- 最小 kth 用于快速选择算法
- 我的Dijkstra算法没有选择短路径
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 为什么我的中位数快速选择算法segfault
- 用于选择一组具有最高值总和的间隔的算法
- 快速选择算法因元素重复而失败
- 选择排序.如何进行选择作为稳定算法
- 如何利用遗传算法求C中数的平方根来实现选择和交叉
- 使用选择算法编译时递归排序
- 遗传算法的选择机制
- 顺序正向选择(SFS)算法
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- 使用计数选择 (C++) 运行中位数算法