Stooge Sort 是一种低效的递归排序算法,甚至慢于冒泡排序。在《算法导论》第二版第7章(快速排序)的思考题中被提到,是由Howard、Fine等教授提出的所谓“漂亮的”排序算法。

  相比经典排序来讲,Stooge Sort 并不是一种优秀的排序算法,但是它的代码十分“漂亮”。简短地几行代码便可完成排序功能。

algorithm stoogesort(array L, i = , j = length(L)-)       

     if L[j] < L[i] then 

         L[i] ↔ L[j] 

     if (j - i + ) >=  then 

         t = (j - i + ) /  

         stoogesort(L, i  , j-t) 

         stoogesort(L, i+t, j  ) 

         stoogesort(L, i  , j-t) 

     return L 

基本理论

  • 如果最后一个值小于第一个值,则交换它们
  • 如果当前子集元素数量大于等于3:
    1. 使用臭皮匠排序前2/3的元素
    2. 使用臭皮匠排序后2/3的元素
    3. 再次使用臭皮匠排序前2/3的元素
算法分析

 
  • 池的划分

    Stooge Sort 把待排序数组分成三个部分:A.小值池、B.交换池、C.大值池。因为数组元素数量可能不被 3 整除,所以这三个池大小大致各占三分之一,但是必须保证 B.交换池 的大小要大于等于其他两个池。
  • 池的排序
    划分池后,Stooge Sort 算法整体可以描述为:
    1. 排序 AB 池元素
    2. 排序 BC 池元素
    3. 排序 AB 池元素
  • 微观排序(3 个元素)
    如果排序元素只有 3 个,那么这 3 个元素会分别占有一个池。根据算法理论,

    1. Stooge Sort 会先对 AB 池排序,较大的元素会进入 B.交换池;
    2. 然后对 BC 池排序,较大的元素会进入 C.大值池;
    3. 最后再次对 AB 池排序,较小值会进入 A.小值池,较大值会进入 B 池。
    排序结果:最小值进入 A.小值池,最大值进入 C.大值池。完成排序。

  • 宏观排序(多于 3 个元素)
    如果排序元素多于 3 个,那么就会涉及到池的划分。池的划分必须满足 B.交换池 的大小要大于等于其他两个池,试想,如果 B.交换池 小于其他两个池,那么第 2 步将不能保证所有大值进入 C.大值池;同样第 3 步也不能保证所有小值进入 A.小值池。
    划分池后,对一个大数组的排序便可以分治成对若干个小数组的排序,直到排序元素数量为 3。
优化的 Stooge Sort

  下面是我对 Stooge Sort 优化后的 C 语言代码:

void stooge(int a[],int i ,int j)
{
if (j-i+ >= )
{
int t=(j-i+)/;
stooge(a, i, j-t);
stooge(a, i+t, j);
stooge(a, i, j-t);
}
else if (a[i] > a[j])
{
int tmp;
tmp=a[i]; a[i]=a[j]; a[j]=tmp;
}
}
原创信息
作者:唯梦永恒
发表日期:2014-5-6
版权说明:自由复制,保留署名

“漂亮的”排序算法 Stooge Sort 如何完成排序的更多相关文章

  1. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  2. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  3. Java排序算法(四)希尔排序2

    Java排序算法(四)希尔排序2 希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { ...

  4. 排序算法<No.7>【希尔排序】

    排序算法进入到第7篇,这个也还是比较基础的一种,希尔排序,该排序算法,是依据该算法的发明人donald shell的名字命名的.1959年,shell基于传统的直接插入排序算法,对其性能做了下提升,其 ...

  5. C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

    C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...

  6. 排序算法| Array.sort()算法规则

    1.js的Array.sort()是使用什么算法排序: 1.火狐中是“归并排序” 2.V8引擎是 “插入排序和快速排序结合”.数组长度不超过10时,使用插入排序.长度超过10使用快速排序.在数组较短时 ...

  7. 《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法

    自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导 ...

  8. 排序算法练习--JAVA(:内部排序:插入、选择、冒泡、快速排序)

    排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... 内部排序: 插入排序:直接插入排序 选 ...

  9. 排序算法<No.3>【桶排序】

    算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个b ...

随机推荐

  1. 学习Spring Boot:(十七)Spring Boot 中使用 Redis

    前言 Redis 1 是一个由Salvatore Sanfilippo写的key-value存储系统. edis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日 ...

  2. Python OS模块中的fork方法实现多进程

    import os '''使用OS模块中的fork方式实现多进程''' '''fork方法返回两次,分别在父进程和子进程中返回,子进程中永远返回0,父进程返回的是子进程的is''' if __name ...

  3. E. The Supersonic Rocket Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)

    http://codeforces.com/contest/1017/problem/E 凸包模板+kmp #include <cstdio> #include <cstdlib&g ...

  4. maven的三种工程pom、jar、war的区别

    转: maven的三种工程pom.jar.war的区别 2018年09月03日 10:02:53 houjx3 阅读数:2918更多 个人分类: maven   1.pom工程:用在父级工程或聚合工程 ...

  5. CronExpression

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTr ...

  6. Java基础-hashMap原理剖析

    Java基础-hashMap原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.什么是哈希(Hash) 答:Hash就是散列,即把对象打散.举个例子,有100000条数 ...

  7. Spark记录-Scala字符串

    Scala字符串 在Scala中的字符串和Java中的一样,字符串是一个不可变的对象,也就是一个不能修改的对象.可以修改的对象,如数组,称为可变对象.字符串是非常有用的对象,在本节的最后部分,我们将介 ...

  8. ifconfig不显示网卡eth0

    参考资料:http://blog.itpub.net/25851087/viewspace-1700568/ 在/etc/sysconfig/network-script/ifcfg-eth0网卡配置 ...

  9. Dubbo学习笔记10:Dubbo服务消费方启动流程源码分析

    同理我们看下服务消费端启动流程时序图: 在<Dubbo整体架构分析>一文中,我们提到服务消费方需要使用ReferenceConfig API来消费服务,具体是调用代码(1)get()方法来 ...

  10. Codeforces 923 D. Picking Strings

    http://codeforces.com/contest/923/problem/D 题意: A-->BC , B-->AC , C-->AB , AAA-->empty 问 ...