世界上的排序算法千千万,作为一名程序设计师 ,若仅对冒泡、插入、选择或者是归并、快排、堆排等主流排序方法背得滚瓜烂熟,未免让排序算法这一斑斓的领域褪色。事实上,排序算法种类多样到令人发指的程度。本文选出三种较有代表性的非主流排序方法略作介绍。

地精排序(Gnome Sort)

传说中最简单的排序算法。从前在一个美丽的大花园中,有一只地精在打零工,工作简单至极——将一排花盆排序。这只小家伙便从第一个花盆开始向后走,每遇到一个更小的花盆,就会将它“拖拽”到应处的位置。终于,地精走到了最后一个花盆处,成功地完成了它的工作。

代码只需要一重循环,但最坏时间复杂度为O(n^2)。不过在原先的花盆较为有序时,地精拖拽花盆的总距离会减少,时间复杂度可达到接近O(n)的程度。综合来看,其时间复杂度和插入排序基本相当。

地精排序C++代码实现:

void Gnome_Sort()
{int i=1;while(i<=n)i>1&&a[i-1]>a[i]?swap(a[i-1],a[i]),i--:i++;
}
一个小优化:将地精走到的最远位置记下,当每一次拖拽完成后使其“瞬间转移”回到过的最远位置,可使其省去再次“检阅”曾经排序过的花盆的麻烦。

臭皮匠排序(Stooge Sort)

一个递归排序算法。它的提出者称其为“一种漂亮的排序算法”,但显然大家并不这样认为,反而在这种算法原理上产生了不好的联想——这个算法由此得名。
其实这种排序算法虽然又慢又不实用,但它的思想的确是“极好的”。

有三个臭皮匠,而整个序列被他们等分成了三份,每一次排序第二个臭皮匠都会先威胁第一个臭皮匠交出所有的大数,并将较小的数强塞到他的手中(递归排序区间内前2/3的数)。之后第三个臭皮匠又对第二个臭皮匠做了同样的事情(再递归排序后2/3的数)。那么整个序列中的大数都到了第三个臭皮匠的手中。而第二个臭皮匠岂能善罢甘休,又将第一个臭皮匠痛扁了一顿,得到了剩余的较大的数(重复第一次排序)。而第一个臭皮匠只能拿着一堆小数感慨自己生不逢时……

注:在整个过程中,三个臭皮匠手中的数的数目不变。

在实际代码实现上,排序的最开始阶段我们需要判断如果这段区间的第一个数大于最后一个数,先将其互换位置,再进行三段排序。

总时间复杂度O(n^2.7)。

臭皮匠排序C++代码实现:

inline void Stooge_Sort(int l,int r)
{if(a[r]<a[l])swap(a[l],a[r]);if(r-l+1>=3){int t=(r-l+1)/3;Stooge_Sort(l,r-t);Stooge_Sort(l+t,r);Stooge_Sort(l,r-t);}
}

猴子排序(Bogo Sort)

这次的主角变成了一只猴子。本算法来源于科学家的一个笑话:让一只猴子坐在键盘前孜孜不倦地乱按,总会有一天,它连续打出的字母恰好是莎翁全集(且不说那时候猴子已经浪费了多少辈子做这些工作,键盘已被按坏了多少)……现在我们所说的程序猿先生们和这只猴子多么相像,同样被“绑在”椅子上夜以继日地打字……
事实上,科学家研究表明猴子们往往对键盘上的某些特定的键更为好奇和喜爱~~ 暂且让我们假设在这个算法中出现的猴子是理想猴子。给猴子一堆写着数的卡片去排序,那么这只可怜的猴子会随意的将卡片抛向空中,张张卡片在空中划出道道美妙的曲线。之后猴子将这些卡片拾起,满怀希望地逐张检查卡片是否被排成有序。随着希望的一次次破灭,卡片的一次次抛起,终会有一天,猴子能够欣喜地发现卡片被排序成功了。
需要说的是,此算法最好时间复杂度为O(n),期望时间复杂度O(n*n!),最坏时间复杂度……
猴子排序C++代码实现:
inline void Shuffle()
{for(int randnum,i=1;i<=n;i++)randnum=rand()%(n-i+1),swap(a[i],a[i+randnum]);
}
inline bool Check()
{for(int i=2;i<=n;i++)if(a[i]<a[i-1])return false;return true;
}
void Bogo_Sort()
{while(!Check())Shuffle();
}
【本文原创,转载请注明出处】http://blog.csdn.net/eolv99/article/details/39576819

【算法杂谈_01】那些非主流排序算法相关推荐

  1. prim算法适用条件_内部排序算法的比较及应用

    "内部排序包括        插入排序(直接插入排序.折半插入排序.希尔排序),        交换排序(冒泡排序.快速排序),        选择排序(简单选择排序.堆排序),       ...

  2. 【数据结构排序算法系列】数据结构八大排序算法

    排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...

  3. 算法 64式 14、排序算法整理_1_1到15题

    1 算法思想 这里将寻找最小/大的前k个数,寻找逆序对,线性时间选择(寻找第k小/大的元素),奇偶/大小写字符分别放在前后部分等和排序相关类型的题目,放在了排序而不是查找中. 1.1含义 排序含义:重 ...

  4. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)

    上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...

  5. 用c语言编写插入排序算法,C语言实现常用排序算法——插入排序

    插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历: 内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历: 当发现有大于待插入元素的元素 ...

  6. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

  7. 抢红包算法 c++_十大排序算法(一):冒泡排序法

    作者:绿皮长条瓜 目录 一.算法介绍 二.MATLAB实现 三.两个例子 一.算法介绍 冒泡排序(Bubble Sort)算法是一种计算科学领域的较简单的排序算法.它重复地走访过要排序的元素列,如果顺 ...

  8. 【算法入门漫画】:“排序算法” 大总结

    冒泡排序: 漫画:什么是冒泡排序? 选择排序: 漫画:什么是选择排序? 插入排序: 漫画:什么是插入排序? 此外还有冒泡排序的变种,鸡尾酒排序: 漫画:什么是鸡尾酒排序? 第三梯队的排序算法有什么共同 ...

  9. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)

    简介 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法实现步骤 从第一个元素开 ...

最新文章

  1. Nacos与Eureka的区别有哪些?
  2. ucore-lab1-练习5report
  3. 整合Struts2、Spring、Hibernate构建J2EE应用
  4. C# 多线程及同步简介示例
  5. Lua开发学习4-普通循环和迭代器循环
  6. 国内linux内核镜像仓库,国内较快的maven仓库镜像
  7. EJB 3.0注入和查找简介
  8. Python黑客编程3网络数据监听和过滤
  9. Java依赖注入 - DI设计模式示例教程
  10. mysql group by cube_group by、grouping sets、with rollup、with cube方法
  11. 写一个模拟彩票中奖的程序及彩票分析
  12. PFC颗粒流 指定文件路径输出方法
  13. 电风扇计算机控制系统,电脑控制型电风扇电路原理与检修
  14. location.href和window.open的几种用法和区别
  15. 联想p720装系统_联想发布ThinkStation P920和P720至强处理器推荐
  16. GitHub的镜像登陆显示Whoa there!解决办法
  17. 百度图片批量下载助手
  18. Windows 11 已修复 AMD CPU 性能问题
  19. 视频分割算法在移动端如何应用
  20. element-ui 级联选择器el-cascader踩坑

热门文章

  1. 链接mysql标签代码_mybase 用户教程(示例代码)
  2. 【已阅】man,cp,mv,alias,more,less,head,tail指令与文件片段读取和管道的初步介绍
  3. 分布式能源接入 Net metering和Feed-in Tariff
  4. Python的word文档读取doc读取
  5. LocalDateTime 输入天数,天数是浮点数,折算成天,时,分,秒计算到LocalDateTime
  6. 计算机网络的产生和发展
  7. Vmware虚拟机上网配置
  8. 汽车博览杂志汽车博览杂志社汽车博览编辑部2023年第7期部分目录
  9. 经历困难后才能见阳光
  10. 安装Velero备份k8s