“漂亮的”排序算法 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 ...
随机推荐
- 洛谷P2387 [NOI2014]魔法森林(LCT)
在XZY&XZZ巨佬的引领下,一枚蒟蒻终于啃动了这道题...... 这次还是第一次写LCT维护边权,还要化边为点,思路乱七八糟的,写起来也不顺手,还好调了许久终于AC啦. 贪心排序按一个关键字 ...
- Elastic-Job-Lite 源码分析 —— 运维平台
本文基于 Elastic-Job V2.1.5 版本分享 1. 概述 2. Maven模块 elastic-job-common-restful 3. Maven模块 elastic-job-cons ...
- HGOI 20181030晚 题解
Problem:给出全班人的个数总分和小明的分数(满分100分),求小明最低排名和最高排名 sol:假设小明的排名为k,总分为sum,小明的分数是r, 贪心求解, 最坏情况下,小明前面的比小明高一分( ...
- Linq与Lambda,神一般的工作效率
Linq与Lambda,神一般的工作效 通过对linq和lambda的学习,越发感觉linq和lambda的重要性,他们能极大地简化程序,同时提升程序的可读性,大大提升了我们的工作效率,在公司的 ...
- [SDOI2017]硬币游戏
考虑生成函数来做 g(x)函数就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n 就是最后s位必须填这个串,但是前面随便填的方案数 然后枚举之前出现了哪个串(包括自己),如果没有相交 ...
- web开发中的跨域整理
1.springboot通过CROS实现跨域: https://www.cnblogs.com/520playboy/p/7306008.html springboot下各种跨域方式: http:// ...
- linux c 编程 ------ 获取时间,计算程序执行时间
#include <time.h> #include <stdio.h> #include <unistd.h> int main(int argc, char a ...
- John:How JavaScript Timers Work
John大神的bolg链接:http://ejohn.org/blog/how-javascript-timers-work/ JavaScript中的定时器经常表现的跟我们想象的不同,我们用三个函数 ...
- sublime Text不能安装插件的解决办法
我的sublime Text不能安装插件,提示如下错误 解决办法如下: 1.点击Preferences > Browse Packages菜单 2.进入打开的目录的“上层目录”,然后再进入Ins ...
- JeeSite 4.x 树形结构的表设计和用法
有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章. 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理 ...