《关于某位小蒟蒻在机房划水没事干于是瞎搞的那档事》

前言

排序算法在题目中经常需要用到,在程序中,我们一般打的是快排,归并,堆排等高效率排序,更有甚者会直接用sort排序,而今天,我要介绍一种奇特的排序方法——Monkey King 排序,我相信接下来的内容会对你有一定帮助。

算法简介

Monkey King 排序也称吉吉国王排序,是一种高效率 排序算法,其发明者是L.E.M.T蒟蒻,于2021年1月28日在机房划水时发明(其实是听取了他人的瞎搞口胡再加以优化),本算法学习门槛极低,适于初学者学习。

思想

模拟猴子(bushi)
我们设想取两个变量 xxx 和 yyy ,表示我们可能要交换的两个数,swap(a[x],a[y])swap(a[x],a[y])swap(a[x],a[y]),交换之后O(n)O(n)O(n)扫一遍判断当前序列是否合法即可。

这时可能有人会问:那时间复杂度不会很高吗?

确实!

所以下面便是吉吉国王排序的核心部分了!

也是降低时间复杂度的关键部分!

我们可以试想如何减少枚举 xxx yyy 的时间。不难想到我们可以模仿猴子随机选择两个数直接用这两个数交换。(yi本正经)

CODE如下

//This is monkeykingsort ! ! !
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],bj;
int main() {scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=2;i<=n;i++) if (a[i]<a[i-1]) {bj=1; break;}srand(time(NULL));while (bj) {int x=rand()%n+1,y=rand()%n+1;swap(a[x],a[y]),bj=0;for (int i=2;i<=n;i++) if (a[i]<a[i-1]) {bj=1; break;}}for (int i=1;i<=n;i++) printf("%d\n",a[i]);
}

但是如果脸黑怎么办呢???
那么很可惜,你不是真正的吉吉国王,但是我们可以通过优化把你变成真正的吉吉国王(???)

优化

当我们枚举两个数时,我们可以想一下什么情况下我们才可以交换。

很显然,当 x<yx<yx<y 且 a[x]>a[y]a[x]>a[y]a[x]>a[y] 的情况我们才能交换(从小到大排)

所以优化后的代码如下:

//This is monkeykingsort ! ! !
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],bj;
int main() {scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=2;i<=n;i++) if (a[i]<a[i-1]) {bj=1; break;}srand(time(NULL));while (bj) {int x=rand()%n+1,y=rand()%n+1;if (x>y) swap(x,y);if (a[x]>a[y]) {swap(a[x],a[y]),bj=0;for (int i=2;i<=n;i++) if (a[i]<a[i-1]) {bj=1; break;}}}for (int i=1;i<=n;i++) printf("%d\n",a[i]);
}

我觉得还行~~~

时间复杂度

理论 O(TN)O(TN)O(TN)(T是交换次数,是“常数”,可以省去) 前提是脸足够好???

所以会退化到 O(无限)O(无限)O(无限)???

就这样吧。。。

不会真的有人看到这里吧(逃

2021/1/29 补:洛谷40PTS

有趣的排序算法——Monkey King排序 详细介绍相关推荐

  1. 排序算法之--桶排序(桶,像桶一样的排序,听起来很有趣哦0。0)

    排序算法之--桶排序 桶排序的工作的原理是将数组分到有限数量的桶子里,而这个有限数量是指多少个呢? 不急,容我细细道来:我们可以先求出这个数组的最大值和最小值,那么桶的数量就是max-min+1咯 为 ...

  2. 经典排序算法之希尔排序

    排序:希尔排序(算法) 一.简介 希尔排序(Shell Sort)是插入排序的一种算法,是对直接插入排序的一个优化,也称缩小增量排序. 希尔排序是非稳定排序算法. 希尔排序因DL.Shell于1959 ...

  3. 经典排序算法 - 鸽巢排序Pigeonhole sort

    经典排序算法 - 鸽巢排序Pigeonhole sort 原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现 ...

  4. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  5. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  6. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

  7. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

  8. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

  9. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

最新文章

  1. python文件读写_python文件操作-读写删除复制总结
  2. HDOJ 1098 Ignatius's puzzle
  3. ArduinoYun教程之ArduinoYun硬件介绍
  4. debian安装python3_debian上安装python3.6
  5. 对于多个 BAPI一起commit!
  6. 如何用android studio测试用例,Android Studio上使用Appium创建测试用例基本步骤
  7. 图像语义分割:FCN全卷积网络概述
  8. 在AWS控制台里根据需要打开指定的通信端口
  9. Linux开发5款实用工具推荐
  10. 牛客网SQL篇刷题篇(24-31)
  11. Jquery中AJAX的应用
  12. 鼠标移上图标字体,让其旋转
  13. 幅度为a0的载波由峰峰值_【砂石骨料】机制砂亚甲蓝值对混凝土性能的影响研究...
  14. python 执行文件的扩展名_python脚本文件的扩展名是什么
  15. HTML期末学生大作业-最新QQ音乐、网易云音乐、酷狗音乐、虾米音乐、咪咕音乐网站html+css+javascript
  16. 论文章的标题与页面的距离不一样(已解决)章标题设置相同的段前段后间距,但各章段前距不一致
  17. ArcBlock 活动 | 亮相西雅图重量级大会 全球共识建设进入新阶段
  18. 计算机创新应用,计算机的发展及应用创新.ppt
  19. 服务器硬盘数据备份到nas,谁说固态硬盘做存储是鸡肋?NAS存储服务器还能这样玩...
  20. 生物信息学算法之Python实现|Rosalind刷题笔记:001 碱基统计

热门文章

  1. 大电流输出信号隔离转换模块
  2. SendMessage用法
  3. js垃圾回收机制,内存泄露和内存溢出,解决闭包产生的内存泄露详解
  4. 用于前列腺近距离放疗的MRI / TRUS数据融合初步结果
  5. Ant Design Mobile是什么?
  6. word计算机桌面加密,word文档加密,怎么让word自动加密 -电脑资料
  7. JetBrains申请学生认证
  8. prometheus alertmanager告警pending
  9. CentOS 安装 Docker 教程
  10. Windows10家庭版升级至专业版