“漂亮的”排序算法 Stooge Sort 如何完成排序
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 优化后的 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 如何完成排序的更多相关文章
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...
- Python实现八大排序算法(转载)+ 桶排序(原创)
插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...
- Java排序算法(四)希尔排序2
Java排序算法(四)希尔排序2 希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { ...
- 排序算法<No.7>【希尔排序】
排序算法进入到第7篇,这个也还是比较基础的一种,希尔排序,该排序算法,是依据该算法的发明人donald shell的名字命名的.1959年,shell基于传统的直接插入排序算法,对其性能做了下提升,其 ...
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
- 排序算法| Array.sort()算法规则
1.js的Array.sort()是使用什么算法排序: 1.火狐中是“归并排序” 2.V8引擎是 “插入排序和快速排序结合”.数组长度不超过10时,使用插入排序.长度超过10使用快速排序.在数组较短时 ...
- 《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法
自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导 ...
- 排序算法练习--JAVA(:内部排序:插入、选择、冒泡、快速排序)
排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现... 内部排序: 插入排序:直接插入排序 选 ...
- 排序算法<No.3>【桶排序】
算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个b ...
随机推荐
- HDU 4280 Island Transport(网络流,最大流)
HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...
- c#(.Net)解析xml
1.一般处理 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml("<?xml version=\"1.0\&quo ...
- jq给单选框 radio添加或删除选中状态
$("#div1 :radio").removeAttr("checked");//删除目标div下所有单选框的选中状态 $("#div1 :radi ...
- P2513 [HAOI2009]逆序对数列
P2513 [HAOI2009]逆序对数列 题目描述 对于一个数列{ai},如果有iaj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序对数.那 ...
- 设计模式之Mixin模式
介绍 mixin模式就是一些提供能够被一个或者一组子类简单继承功能的类,意在重用其功能.在面向对象的语言中,我们会通过接口继承的方式来实现功能的复用.但是在javascript中,我们没办法通过接口继 ...
- spring注解 @Scheduled(cron = "0 0 1 * * *")实现定时的执行任务
@Scheduled(cron = "0 0 1 * * *") 在使用该注解以前请做好以下准备工作,配置好相应的xm文件. 配置定时注解的步骤:http://blog.csdn. ...
- Spring RedisTemplate操作-事务操作(9)
@Autowired @Qualifier("redisTemplate") private RedisTemplate<String, String> stringr ...
- jQuery下实现等待指定元素加载完毕
先声明下这个方法的使用场合,以免误导大家..比如在博客园,我们没法修改他的源代码,那么只能想办法监视元素的出现了.所以下面方法是在修改不了源码的情况下使用,而非写自己的项目.. 今天在改博客几个样式的 ...
- C标准库函数中复杂的函数声明
<signal.h> 中有一个复杂的函数声明.很叫人费解. void (*signal(int sig, void (*handler)(int)))(int); 我们按照向右看向左看的黄 ...
- TTPRequest 提示#import <libxml/HTMLparser.h>找不到 的解决方法
本文永久地址为http://www.cnblogs.com/ChenYilong/p/3984251.html ,转载请注明出处. ASIHTTPRequest 或者AFNetwork提示的#impo ...