Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Stooge排序的稳定实现?_Algorithm - Fatal编程技术网

Algorithm Stooge排序的稳定实现?

Algorithm Stooge排序的稳定实现?,algorithm,Algorithm,这真的有可能吗?我在wikipedia的Inefficient排序下找到了它,但是我还不能完美地可视化这个过程,所以我不知道我需要做什么改变才能使它稳定。任何基于比较的排序算法都可以变得稳定。只需更改比较函数,这样,如果两个元素相等,它就会比较它们的原始索引。由于stooge排序是一种基于比较的排序,因此也可以在此处应用。首先,请注意,实际上只有一个步骤可以改变元素的顺序:第一个步骤。其余步骤都是递归步骤。改变任何一个递归步骤都会改变算法的基本特征,这样,如果我们不以这种方式递归,它就不再是st

这真的有可能吗?我在wikipedia的Inefficient排序下找到了它,但是我还不能完美地可视化这个过程,所以我不知道我需要做什么改变才能使它稳定。

任何基于比较的排序算法都可以变得稳定。只需更改比较函数,这样,如果两个元素相等,它就会比较它们的原始索引。由于stooge排序是一种基于比较的排序,因此也可以在此处应用。

首先,请注意,实际上只有一个步骤可以改变元素的顺序:第一个步骤。其余步骤都是递归步骤。改变任何一个递归步骤都会改变算法的基本特征,这样,如果我们不以这种方式递归,它就不再是stooge排序(这三个递归调用似乎是典型的“stoogey”)

第一步也很简单,改变它似乎也会改变算法的特性。但我们可以对其进行调整:如果初始元素大于最终元素,则将等于最终元素的第一个元素a与等于初始元素a之前的最后一个元素交换,我们可以通过一次传递找到该元素。令人惊讶的是,尽管内部循环现在是O(n)而不是O(1),但向我们显示,复杂性在O(n^2.71)时保持不变。同样正确的是,如果所有元素都是唯一的,那么交换的顺序将与原始的Stooge排序相同,这使得这个版本成为近亲

<> P>快速草拟为什么这个版本是稳定的,考虑两个相等元素的重新排序是一个“坏交换”。我们声称使用上述方法不存在不良掉期。原因是,对于任何交换,我们知道两个元素之间没有一个元素等于任何一个元素。由于相等的元素保持相同的顺序,因此该算法是稳定的

算法正确性的证明类似于原始Stooge排序的正确性证明。这是一个常见的家庭作业问题,所以我不想泄露它,但它遵循归纳假设

如果对调整的描述有点简洁,下面将介绍一个Java实现

导入java.util.array;
导入java.util.Random;
公共级马厩{
公共静态类FooBar实现了可比较的{
公开决赛国际足联;
公共最终积分栏;
公共FooBar(intfoo,intbar){
this.foo=foo;
这个.bar=bar;
}
@凌驾
公共整数比较(FooBar arg0){
返回foo-arg0.foo;
}
公共字符串toString(){
返回foo+“:”+条;
}
}
私有静态void排序(可比较的[]c,int start,int end){
如果(开始>=结束)返回;
如果(c[start]),则与(c[end])>0进行比较{
//找到第一个X等于结束的东西和最后一个Y在X之前等于开始的东西
int lastindex=结束;
int firstindex=start;
对于(int i=start+1;i=3){
第三个整数=(结束-开始+1)/3;
排序(c、开始、结束第三);
排序(c,开始+第三,结束);
排序(c、开始、结束第三);
}
}
公共静态无效排序(可比[]c){
排序(c,0,c.length-1);
}
公共静态void main(字符串[]args){
FooBar[]测试=新FooBar[100];
FooBar[]testsav=新FooBar[100];
随机r=新随机();
对于(int i=0;i<1000;i++){
对于(int j=0;j