一堆乱七八糟绝不正经的排序算法

原文

索引

  1. 猴子排序
  2. 钻石排序(戴蒙德排序)
  3. 恶魔排序
  4. 珠排序
  5. 地精排序(怂货排序)
  6. 智能设计排序

1. 猴子排序

(提供者cy1306110516)

猴子排序的思想源自于著名的无限猴子定理。

既然猴子们能敲出《哈姆雷特》,区区排序又算什么呢?

思路:

  1. 判断数组是否有序,如果无序,进入下一步。
  2. 随机打乱数组,回到上一步。

适用人群:

欧皇

时间复杂度:

  • 最坏情况O(∞)
  • 最好情况O(n)

算法实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,a[100005];
 4 inline void random_(){
 5     for (int i=1;i<=n;i++) swap(a[i],a[i+rand()%(n-i+1)]);
 6     //打乱,AC全靠RP
 7 }
 8 inline bool check(){
 9     for (int i=2;i<=n;i++) if (a[i]<a[i-1]) return false;
10     return true;
11     //判断是否有序
12 }
13 inline void bogo_sort(){
14     while (!check())
15     random_();
16     //核心代码
17 }
18 int main(){
19     scanf("%d",&n);
20     srand(time(NULL));
21     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
22     bogo_sort();
23     for (int i=1;i<=n;i++) printf("%d ",a[i]);
24     return 0;
25 }//提供者cy1306110516

2. 钻石排序

(提供者DARTH_VADER)

钻石排序(又名戴蒙德排序)的思想源自于演化生物学家贾雷德·戴蒙德的作品《枪炮、病菌与钢铁》。

思路:

  1. 对于数组中的每一项,创造一个等同人数的人类部落。
  2. 让他们独立地发展。
  3. 第一个发展出枪支的最大,以此类推。

适用人群:

极远未来的统治阶层

时间复杂度:

O(n),常数为13000年。

代码实现:

暂无


3.恶魔排序

(提供者DARTH_VADER)

恶魔排序的思想源自于十九世纪英国物理学家詹姆斯·克拉克·麦克斯韦的麦克斯韦恶魔假说

思路:

创造这样的一种气体:其每一个分子运动速度与数组中的每一个数成比例。

将这样的气体灌入一个密封的盒子,该盒子被一分为二,中间有一个小孔接通两侧。

小孔一次只能经过一个分子。

每一次迅速打开小孔,让特定分子经过。

那么长时间后,盒子将一侧热一侧冷。

对于每一侧,分治进行本算法。

适用人群:

麦克斯韦的恶魔

时间复杂的:

O(n!)

代码实现:

暂无


4. 珠排序

(提供者502_Bad_Gateaway)

珠排序的思想源自于中国历史悠久的算盘。(大雾)

思路:

  1. 对于每一个数字,我们用一排珠子表示。
  2. 将这些珠子叠在一起,使其自然下落。
  3. 每一层的珠子数量即为该位置数值。

适用人群:

喜好珠算的OIer

时间复杂度:

这个。。。呃呃呃看你怎么说了

代码实现:

等一下哈,本人正在敲


5. 怂货地精排序

(提供者502_Bad_Gateaway)

怂货排序。。。很怂。

思路:

  1. 当i=0或a[i]>a[i-1]时,i++。
  2. 否则交换a[i]与a[i-1],i--。

适用人群:

正常人类

时间复杂度:

O( n^2n2 )

代码实现:

 1 void gnome_sort(int unsorted[]){
 2     int i = 0;
 3     while (i < unsorted.Length){
 4         if (i == 0 || unsorted[i - 1] <= unsorted[i])i++;
 5         else{
 6             int tmp = unsorted[i];
 7             unsorted[i] = unsorted[i - 1];
 8             unsorted[i - 1] = tmp;
 9             i--;
10         }
11     }
12 }//提供者DARTH_VADER

6. 智能设计排序

(提供者DARTH_VADER)

智能设计排序的思想源自于智能设计论(智设论)

思路:

假设我们有一些数字(它们组成了给出的数组),那么它们恰好排序成给出的数组的概率是 \frac{1}{n!}n!1?。

面对如此小的可能性,我们断言这样的数组是随机出现的,未免太过果断。

有理由相信,这样的一个数组是一个有自我意志的排序者给出的。

由于我们对排序的认知被局限在递增或递减,揣摩排序者用意的行为是不理智的。

因此大可放心:数组已被排序!

适用人群:

懒人

时间复杂度:

O(0),当然算上输入就是O(n)

代码实现:

1 #define donothing return
2 void intelligentDesignSort(int list[]){
3     donothing;
4 }//提供者DARTH_VADER
5  

原文地址:https://www.cnblogs.com/bztMinamoto/p/9392571.html

时间: 2024-08-08 03:45:26

一堆乱七八糟绝不正经的排序算法的相关文章

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

排序算法性能比较

算法思路 排序算法 时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 插入排序 直接插入 O(n2) O(n) O(n2) O(1) 是 希尔排序 O(n(logn)2)     O(1) 否 交换排序 冒泡排序 O(n2) O(n) O(n2) O(1) 是 快速排序 O(nlogn) O(nlogn) O(n2) O(logn) 否 选择排序 直接选择 O(n2) O(n2) O(n2) O(1) 否 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 否 归并排序 归

数据结构:排序算法

排序算法 <<插入排序>> *直接插入排序* 思想 每次取剩下的一个元素插入到已经有序的序列中. 代码 public static void InsertSort(int[] arr){ if(arr == null || arr.length == 0){ System.err.println("ERROR INPUT"); return; } int n = arr.length; for(int i = 1; i < n; i++){ int tem

排序算法汇总

1.排序算法简介 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序.假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的:否则称为不稳定的.   比较类非线性时间排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序).   非比较类

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

桶排序,计数排序算法

计数排序: 桶排序:www.roading.org/algorithm/introductiontoalgorithm 算法模型: 1,桶排序假设待排的一组数统一分布在一个范围[m....n],将这一范围划分为几个子范围,也就是桶bucket. 例如,如何将0---999范围的数,划分到10个桶中?范围中数的个数用K表示,那么K/10=1000/10=100,就是每个桶装100个元素,即[0..99]装到第一个桶中,[100..199]装到第二个桶中,...以此类推. 怎么判断一个数组该放到哪个

【每日算法】排序算法总结(复杂度&amp;稳定性)

一.插入排序:稳定,时间复杂度O(n^2) 想象你在打扑克牌,一开始左手是空的,接着右手开始从桌上摸牌,并将其插入到左手的一把牌中的正确位置上.为了找到这个正确位置,我们需要从右到左将它与手中的牌比较,直到找到合适的位置插入.整个过程的特点是,左手的牌是排好序的了. 详见: 插入排序 二.选择排序:不稳定,时间复杂度O(n^2) 每趟从未排序部分选出最小的元素,然后通过交换将其添加到已排序部分中. 详见: 选择排序 三.冒泡排序:稳定,时间复杂度O(n^2) 将待排序的元素看作是竖着排列的"气泡

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

10种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要.为了选择合适的算法,可以按照建议的顺序考虑以下标准: (1)执行时间 (2)存储空间 (3)编程工作    对于数据量较小的情形,(1)(2)差别不大,主要考虑(3):而对于数据量大的,(1)为首要.   主要排序法有: 一.冒泡(Bubble)排序——相邻交换 二.选择排序——每次最小/大排在相应的位置 三.插入排序——将下一个插入已排好的序列中 四.壳(Shell)排序——缩小增量 五.归并排序 六.快速排序 七.堆排序 八.拓扑排序 九