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. 【题解】 [ZJOI2006]书架 (Splay)

    懒得复制,戳我戳我 Solution: 还是一个\(Splay\),我们只用多存一个值\(rad\)来维护二叉树,然后用数组存下每个书对应的值是多少 \(Top\)操作,我是把\(s\)旋转到根节点, ...

  2. python之旅:并发编程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  3. Java基础-比较运算符Compare Operators

    Java基础-比较运算符Compare Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关系运算符 关系运算符包括: 1>.大于(>) 2> ...

  4. 设置 Linux 服务器中 MySQL 允许远程访问

    开启 MySQL 远程访问权限: 在linux系统上登陆mysql服务. -- root 是用户名 [root@localhost ~]# mysql -u root -p Enter passwor ...

  5. C# 获取文件图标

    今天突然想到一个问题,如何去获取一个文件的关联图标呢?于是就上网搜索了一下.现总结如下: 首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标. 在网上搜了一圈,发现方法还是比较多的,但是 ...

  6. influxdb简单使用

    之前对influxdb有一个简单的了解和入门的使用,近期由于想使用influxdb做一点东西玩玩,又要捡起influxdb.本篇就针对influxdb的数据库.表的概念,增删改查操作.RESTful操 ...

  7. bzoj千题计划295:bzoj3140: [Hnoi2013]消毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...

  8. 流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署

    源码下载地址:https://github.com/EasyDarwin/EasyDarwin/archive/v7.0.5.zip 查看 Ubuntu 的版本号 sudo lsb_release - ...

  9. Java SSM框架之MyBatis3(二)MyBatis之Mapper代理的开发方式

    Mapper代理的开发规范 1. mapper接口的全限定名要和mapper映射文件的namespace值一致. 2. mapper接口的方法名称要和mapper映射文件的statement的id一致 ...

  10. 作为一个有B格的前端工程师需要掌握的一些知识

    如果说你3年还在不停地切页面的... 那么你对http协议的了解程度 你的原生的javascript的掌握程度 你的页面的优化的理念 你在写页面是否会有什么独特地技巧 你对ajax的get和post方 ...