猴子排序
原理:现有一组未排序数据和相同数量的方格,然后依次随机地取出数据随机地放入方格中,直到把方格放满即止。
之所以又被称为猴子排序,我的猜测是因为。将这种随机的特性利用猴子来形容,毕竟猴子并不懂数的大小,让猴子选择和放置数据肯定就是随机的了!
是不是觉得很无语呢,这尼玛也是排序。不过再看其实它还是能达到我们想要的排序效果的,虽然概率很小(数据比较多的时候)。既然能解决问题,被称为方法也是无可厚非。
这个真实的含义就是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了,也有可能很多次后依然无序。
下面是Java代码
package hs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
*
*
* @ClassName: MonkeySort
* @Description: 经典排序算法猴子排序
* @author jiangya
* @date 2019年1月10日 下午4:25:36
*/
public class MonkeySort {
public static void main(String[] args) {
Listarr = new ArrayList();// 建一个无序的数组
arr.add(2);
arr.add(5);
arr.add(3);
arr.add(8);
arr.add(324);
arr.add(22);
arr.add(223);
arr.add(636);
arr.add(44);
Long sum = 0L;
Date sdate = new Date();
SortThread sortThread = new SortThread(arr, sdate, sum);
sortThread.run();
}
}
// 排序线程
class SortThread extends Thread {
Listarr = null;
Thread t = null;
Date startDate = null;
Long sum = 0L;
public SortThread(Listarr, Date startDate, Long sum) {
this.arr = arr;
this.startDate = startDate;
this.sum = sum;
}
public void run() {
Collections.shuffle(arr);// 随机打乱
System.out.println(arr);
for (int i = 0; i < arr.size() - 1; i++) {
if (arr.get(i) < arr.get(i + 1)) {
continue;
} else {
sum++;
new SortThread(arr, startDate, sum).start();
return;// 结束当前线程
}
}
System.err.println("花了" + (new Date().getTime() - startDate.getTime()) + "ms时间,排序数组元素个数:" + arr.size() + ",共进行了"
+ sum + "次");
}
}