猴子排序-------O(n)

一、定义

猴子本身不易驯服,多动、爱玩和调皮,猴子排序精髓就在一个字,所以我们只需要对需要排序的数组进行"随心所欲"的乱排序即可.

二、实现

1.待排序的数组arr.

2.保存已排序的数据的数组res.

3.辅助数组help用来记录arr的那个位置已经进行了使用.

代码:

import java.util.*;
public class 猴子排序 {

public static void main(String[] args) {
int[] arr = { 32, 21, 26, 27, 83, 22, 99 };
int[] res = new int[arr.length]; //用來接受排序好的結果
int cnt = 0;// 计算经过多少次乱排
while (sort(arr,res) != 1) {
cnt++;
}
System.out.println(cnt);
System.out.println(Arrays.toString(res));
}

static int sort(int[] arr,int[] res) {
int[] help = new int[arr.length];

Random rd = new Random();
for (int i = 0; i < arr.length; i++) {
while (true) {
int num = rd.nextInt(arr.length) % arr.length; // 随机产生0-length-1的数
if (help[num] == 0) { //没有访问过
help[num] = 1;// 标记为1 表示已经访问
res[i] = arr[num];//将没有访问的数按照顺序放入res中
break;
}
}
}
//对res检查 看是否有序
for (int i = 0; i < arr.length - 1; i++) {
if (res[i] > res[i + 1])
return 0;// 表示乱排序失败
}
// 当经过了以上,表示成功 返回1
return 1;
}

}