本文地址:http://www.cnblogs.com/archimedes/p/stooge-bogo-sort-algorithm.html,转载请注明源地址。

Stooge排序算法

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

使用Stooge排序为一列数字进行排序的过程

Stooge排序算法原理:

1、如果最后一个值小于第一个值,则交换它们

2、如果当前子集元素数量大于等于3:

  • 使用Stooge排序前2/3的元素

  • 使用Stooge排序后2/3的元素

  • 再次使用Stooge排序前2/3的元素

算法的复杂度正比于: T(n)=3T(2n/3)+1. 已被证明时间复杂度接近于O(n2.71) ,可见此算法效率相当的低下,比选择、插入、冒泡排序更差

算法实现:

  1. // Completed on 2014.10.8 21:35
  2. // Language: C99
  3. //
  4. // 版权所有(C)codingwu (mail: oskernel@126.com)
  5. // 博客地址:http://www.cnblogs.com/archimedes/
  6.  
  7. #include<stdio.h>
  8. #include<stdbool.h>
  9. void swap(int *a, int *b) //交换两元素的值
  10. {
  11. int t;
  12. t = *a;
  13. *a = *b;
  14. *b = t;
  15. }
  16. void printArray(int a[], int count) //打印数组元素
  17. {
  18. int i;
  19. for(i = ; i < count; i++)
  20. printf("%d ",a[i]);
  21. printf("\n");
  22. }
  23. void stooge_sort(int a[], int left, int right)
  24. {
  25.  
  26. int t;
  27. if(a[left] > a[right])
  28. swap(&a[left], &a[right]);
  29. if(right - left + >= ) {
  30. t = (right - left + ) / ;
  31. stooge_sort(a, left, right - t);
  32. stooge_sort(a, left + t, right);
  33. stooge_sort(a, left, right - t);
  34. }
  35.  
  36. }
  37. int main(void)
  38. {
  39. int a[] = {, , , , , , , , };
  40. int n = sizeof(a) / sizeof(*a);
  41. printArray(a, n);
  42. stooge_sort(a, , n - );
  43. printArray(a, n);
  44. return ;
  45. }

Bogo排序算法

在计算机科学中,Bogo排序(bogo-sort)是个既不实用又原始的排序算法,其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。其名字源自Quantum bogodynamics,又称bozo sort、blort sort或猴子排序.

其平均时间复杂度是 O(n × n!),在最坏情况所需时间是无限。它并非一个稳定的算法。

运行时间

这个排序算法基于可能性。平均而言,让所有元素都被排好序的期望比较次数渐近于(e-1)n!,期望的位置交换次数渐近(n-1)n!。期望的位置交换次数增长地比期望比较次数快,是因为只需要比较几对元素就能发现元素是无序的,但是随机地打乱顺序所需要的交换次数却与数据长度成比例。在最差的情况下,交换和比较次数都是无限的,这就像随机投掷硬币可能连续任意次正面向上。

最好的情况是所给的数据是已经排好序的,这种情况下不需要任何位置交换,而比较次数等于n-1。

对任何固定长度的数据,算法的预期运行时间像无限猴子定理一样是无限的:总有一些可能性让被正确排好序的序列出现。

算法实现:

  1. // Completed on 2014.10.8 21:50
  2. // Language: C99
  3. //
  4. // 版权所有(C)codingwu (mail: oskernel@126.com)
  5. // 博客地址:http://www.cnblogs.com/archimedes/
  6.  
  7. #include<stdio.h>
  8. #include<stdbool.h>
  9. void swap(int *a, int *b) //交换两元素的值
  10. {
  11. int t;
  12. t = *a;
  13. *a = *b;
  14. *b = t;
  15. }
  16.  
  17. void printArray(int a[], int count) //打印数组元素
  18. {
  19. int i;
  20. for(i = ; i < count; i++)
  21. printf("%d ",a[i]);
  22. printf("\n");
  23. }
  24.  
  25. unsigned int Random1(int a, int b) //随机生成[a,b)之间的数
  26. {
  27. return (rand() % (b - a) + a);
  28. }
  29.  
  30. unsigned int Random2(int n) //随机生成[0,n)之间的数
  31. {
  32. return (rand() % n);
  33. }
  34.  
  35. bool inorder(int a[], int n) //判断序列是否已经有序
  36. {
  37. int i;
  38. for(i = ; i < n; i++)
  39. {
  40. if(a[i] > a[i + ]) return false;
  41. }
  42. return true;
  43. }
  44.  
  45. void shuffle(int a[], int n)
  46. {
  47. int i, swapPosition;
  48. for(i = ; i < n; i++)
  49. {
  50. swapPosition = Random2(i + );
  51. swap(&a[i], &a[swapPosition]);
  52. }
  53. }
  54.  
  55. void bogo_sort(int a[], int n)
  56. {
  57. while(!inorder(a, n))
  58. shuffle(a, n);
  59. }
  60.  
  61. int main(void)
  62. {
  63. int a[] = {, , , , , , , , };
  64. int n = sizeof(a) / sizeof(*a);
  65. srand((unsigned)time(NULL));
  66. printArray(a, n);
  67. bogo_sort(a, n);
  68. printArray(a, n);
  69. return ;
  70. }

Stooge排序与Bogo排序算法的更多相关文章

  1. Hark的数据结构与算法练习之Bogo排序

    算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变 ...

  2. “漂亮的”排序算法 Stooge Sort 如何完成排序

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

  3. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  4. java排序算法(八):希尔排序(shell排序)

    java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...

  5. 排序算法的C语言实现(下 线性时间排序:计数排序与基数排序)

    计数排序 计数排序是一种高效的线性排序. 它通过计算一个集合中元素出现的次数来确定集合如何排序.不同于插入排序.快速排序等基于元素比较的排序,计数排序是不需要进行元素比较的,而且它的运行效率要比效率为 ...

  6. JavaScript实现获取两个排序数组的中位数算法示例

    本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...

  7. Java排序 - 不实用的几个排序算法 -- 睡眠排序、猴子排序、面条排序、珠排序

    介绍几个不实用的排序算法,一来可以在学习时增加一些乐趣,放松一下自己,二来可以学习一下.思考一下这些算法失败在哪里,又是否存在一些好的地方? 睡眠排序 这是一个思想比较简单,脑洞巨大的算法 -- 我们 ...

  8. 内部排序->其它->地址排序(地址重排算法)

    文字描述 当每个记录所占空间较多,即每个记录存放的除关键字外的附加信息太大时,移动记录的时间耗费太大.此时,就可以像表插入排序.链式基数排序,以修改指针代替移动记录.但是有的排序方法,如快速排序和堆排 ...

  9. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

随机推荐

  1. IOS雕虫小技

    1,你所不知道的Mac截图的强大 2,抓包工具WireShark开发必备,需要装X11插件 3,Mac远程控制Windows桌面-CoRD.或者TeamViewer 4,Mac下解压缩BetterZi ...

  2. sass调试--页面看到sass文件而不是css文件问题

    在浏览器页面有时看到sass文件而不是css文件问题,其主要由于sass开启了source-map(调试)功能,问题如下图: sass调试 sass调试需要开启编译时输出调试信息和浏览器调试功能,两者 ...

  3. ServiceStack.Redis 中关系操作的局限与bug

    redis是文档型的,nosql中难处理的是关系. 比如人可以发博客,博客可以有分类.按照传统sql中,用户表和分类表都是主表,博客表是从表,有用户的外键和分类的外键 如果使用文档型的思考方式. 为用 ...

  4. RTX发送消息提醒实现以及注意事项

    一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化,提高企业生产力.RTX平台的主要功能 ...

  5. Linq查询操作之Where筛选

    筛选操作where能够处理逻辑运算符组成的逻辑表达式.比如逻辑“与”,逻辑“或”,并从数据源中筛选数据,它和where子句的功能非常相似.Enumerable类的Where()原型如下: public ...

  6. [爬虫学习笔记]用于提取网页中所有链接的 Extractor 模块

            Extractor的工作是从下载的网页中将它包含的所有URL提取出来.这是个细致的工作,你需要考虑到所有可能的url的样式,比如网页中常常会包含相对路径的url,提取的时候需要将它转换 ...

  7. VS如何显示行号

    1.随便打开一个项目,可以看到代码框内并没有显示行号 2.选择“工具”-“选项”,打开后界面如下 3.选择文本编辑器,找到下图中的“行号”并勾选 4.行号可以显示了

  8. 【Unity】13.3 Realtime GI示例

    分类:Unity.C#.VS2015 创建日期:2016-04-19 一.简介 使用简单示例而不是使用实际示例的好处是能让你快速理解光照贴图和光影效果相关的概念和基本设置办法,这样可避免实际复杂场景中 ...

  9. C#十五子游戏

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. dstat 备忘

    http://dag.wiee.rs/home-made/dstat/#download https://github.com/dagwieers/dstat http://lhflinux.blog ...