洗牌!打乱一组有序数

将一个有序数组打乱

方法一:利用随机得到的索引一次交换

import java.util.Arrays;

public class Test3 {
	public static void main(String[] args) {
		int[] m = new int[20];
		// 创建一个有序数组
		for (int i = 0; i < 20; i++) {
			m[i] = i + 1;
		}
		System.out.println(Arrays.toString(m));
		// 打乱有序数组
		// 从下标 0 开始,与随机得到的下标 j 对应的元素交换
		for (int i = 0; i < m.length; i++) {
			int j = (int) (Math.random() * 20);
			int t = m[i];
			m[i] = m[j];
			m[j] = t;
		}
		System.out.println(Arrays.toString(m));
	}
}

方法二:利用洗牌时分成两半依次插入每张牌,最后合并的思想

import java.util.Arrays;

public class Test3 {
	public static void main(String[] args) {

		
		// 将一个有序序列打乱
		// 思想:分两半洗牌,两半依次间隔插入
        int[] test = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        System.out.println(java.util.Arrays.toString(test));
        int[] test1 = new int[5];
        int[] test2 = new int[5];
        // 外层循环:两半依次间隔插入的次数,加强随机性
        for (int k = 0; k < (Math.random() * 20 + 1); k++) {
        	// 将数组拆分成两半
            for (int a = 0; a < test.length; a++) {
                if (a < test.length / 2) {
                    test1[a] = test[a];
                } else {
                    test2[a- (test.length / 2)] = test[a];
                }
            }
            // 将两个拆分后的数组随机合并
            int b = 0;
            for (int a = 0; a < 5; a++) {
                int rand = (int)(Math.random() * 2 + 1);
                switch (rand) {
                    case 1:
                        test[b] = test1[a];
                        test[b+1] = test2[a];
                        b+=2;
                        break;
                    case 2:
                        test[b] = test2[a];
                        test[b+1] = test1[a];
                        b+=2;
                        break;
                }
            }
        }
        System.out.println("打乱有序序列");
        System.out.println(java.util.Arrays.toString(test));
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值