标签: stable-sort

数组中两类元素的稳定分离

考虑以下问题.

我们给出了一组属于两个类的元素:红色或蓝色.我们必须重新排列数组的元素,以便所有蓝色元素首先出现(并且所有红色元素都会出现).必须以稳定的方式完成重新排列,这意味着必须保留蓝色元素的相对顺序(红色元素的相对顺序).

是否有一个聪明的算法可以就地执行上述重新排列?

当然,非现场解决方案很简单.

一个明显的就地解决方案是将任何稳定的排序算法应用于阵列.然而,在阵列上使用完整的排序算法直观地感觉就像是一种过度杀伤,特别是考虑到我们只处理两类元素这一事实.

任何想法都非常感激.

sorting algorithm in-place stable-sort

6
推荐指数
1
解决办法
407
查看次数

我该如何进行稳定排序?

如何稳定排序数组?我想要排序的值可能有很多重复,我不确定ruby使用哪种排序算法.我认为插入排序对我来说效果最好.

例:

a = [[:a, 0], [:b, 1], [:c, 0], [:d, 0]]
a.sort_by { |x, y| y }  # => [[:a, 0], [:d, 0], [:c, 0], [:b, 1]]
Run Code Online (Sandbox Code Playgroud)

寻找

[[:a, 0], [:c, 0], [:d, 0], [:b, 1]]
Run Code Online (Sandbox Code Playgroud)

ruby sorting stable-sort

6
推荐指数
1
解决办法
194
查看次数

是否可以在 O(n log n) 且辅助空间不变的情况下稳定地对数组进行排序?

给定一个n个元素的数组,是否有一个排序算法

  1. 排序最多O(n log n)时间(并且可选地,在最好的情况下, O(n)时间)
  2. 是稳定的
  3. 占用O(1)辅助空间

我发现的所有排序算法仅满足以下标准中的两个:

  • 冒泡排序满足2和3
  • 归并排序满足1和2
  • 堆排序满足1和3

有没有一种算法可以满足这三个标准?

sorting stable-sort

5
推荐指数
1
解决办法
1844
查看次数

在MATLAB中稳定准确

MATLAB的内置函数accumarray接受函数fun作为第四个参数.

A = accumarray(subs,val,sz,fun);
Run Code Online (Sandbox Code Playgroud)

这适用funval具有相同下标的元素的每个子集subs.但文件说明:

如果下标subs未按其线性索引排序,则fun不应取决于其输入数据中值的顺序.

我们如何实现一个没有这个限制的稳定版本accumarray,但是会保证子集采用与给定的相同的顺序val

例:

subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
Run Code Online (Sandbox Code Playgroud)

这样做的预计产出将是11:20,如果accumarray是稳定的.实际上输出是:

ans =
    11    12    13    14     5     6     7    18    19    20
Run Code Online (Sandbox Code Playgroud)

我们的实施应该产生:

accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
    11    12    13    14    15    16    17    18    19    20
Run Code Online (Sandbox Code Playgroud)

matlab stable-sort accumarray

5
推荐指数
1
解决办法
430
查看次数

"stable_sort()ing"C++中的STL <list>

我认为问题标题足够清楚:是否可以在C++中使用stable_sort()一个std :: list?或者我必须将其转换为std :: vector?

我问,因为我尝试了一个简单的例子,它似乎需要RandomAccessIterators,链表没有.那么,我如何稳定排序std :: list()

编辑:示例代码,给我一个错误:

#include <list>
#include <algorithm>
// ...
list<int> the_list;
stable_sort(the_list.begin(), the_list.end());
Run Code Online (Sandbox Code Playgroud)

g ++给了我大约30行错误(粘贴时间太长),其中一些错误指的是RandomAccessIterators(以及一些名为_merge_sort_loop的东西).这有点奇怪,因为我已经看到链接列表的一些合并排序实现,它们几乎是"顺序的".

c++ stl list stable-sort

4
推荐指数
1
解决办法
1983
查看次数

Iterator和反向迭代器之间的区别

以下两个代码片段之间有什么区别.

vector<int> a;
// initialization code
sort( a.rbegin(), a.rend() );
Run Code Online (Sandbox Code Playgroud)

vector<int> a;
// same initialization as above
sort(a.begin(), a.end(), comp);
Run Code Online (Sandbox Code Playgroud)

其中comp是下面给出的布尔函数

bool comp( int i, int j)
{
    return i>j;
}
Run Code Online (Sandbox Code Playgroud)

为了说明,下面的代码给出了WA,而这段代码为SPOJ问题XMAX提供了AC.ACWA之间的唯一区别是使用的sort()版本.

c++ algorithm comparison stl stable-sort

4
推荐指数
1
解决办法
2367
查看次数

内置qsort函数和稳定排序函数有什么区别?

从引用的各种来源我知道内置的C函数,stable_sort是稳定的但qsort是不稳定的.如果是这种情况,我们为什么要使用qsort呢?这不是多余的吗?为什么不使用stable_sort呢?

c++ sorting qsort stable-sort

4
推荐指数
2
解决办法
505
查看次数

如何排序数组但保留重复元素在C中的位置?

所以,实际上我需要的是在排序之后保留旧数组的索引.所以例如,如果我输入[2,4,1,5,7,9,6]那么输出是[2,0,1,3,6,4,5].我已经使用了qsort,如果没有重复的元素,它的效果非常好.

如果存在重复元素,有时会将第一个重复元素放在最后.例如,如果输入是[5,4,6,5,2,1,3],我想要输出的是[5,4,6,1,0,3,2].那么,5哪个索引0放在5哪个之前有索引3.但是,qsort有时使用输出[5,4,6,1,3,0,2].

你能帮我解决这个问题吗?或者我应该创建自己的排序功能?你能帮我创建一下吗?

这是我的代码:

#include <stdlib.h>

int* sortidx(double *X,int n)
{
    int *idx,i,j;

    int cmp(const void *a,const void *b)
    {
        return X[*(int*)a]>=X[*(int*)b]?1:-1;
    }

    idx=(int*)calloc(n,sizeof(int));

    for(i=0;i<n;i++)
    {
        idx[i]=i;
    }

    qsort(idx,n,sizeof(int),cmp);

    return idx;
}
Run Code Online (Sandbox Code Playgroud)

c arrays sorting qsort stable-sort

4
推荐指数
1
解决办法
313
查看次数

.NET中是否有内置的稳定排序例程和交换功能?

在.NET中是否有任何内置的稳定排序例程?

我知道C++在"算法"下有一个内置的排序例程std::sort().同样,我们有什么东西可以和C#一起使用吗?

另外,.NET中是否有内置交换功能?

.net c# standard-library built-in stable-sort

3
推荐指数
1
解决办法
4710
查看次数

如何在Delphi中使用稳定排序替换StringList.Sort?

我正在做一个简单的StringList.sort,但是Delphi使用的QuickTort不是一个稳定的排序,这意味着它可能会改变具有相同键的记录的相对顺序.

我需要使用稳定的排序.对我来说,实现这个最简单的方法是什么?


Mike W的答案可能是最简单的方法,无需进行太多的代码更改.

谢谢,迈克.

delphi sorting tstringlist stable-sort

3
推荐指数
1
解决办法
859
查看次数