【java基础---嵌套for循环经典题目】冒泡排序,生成去重随机数

1.冒泡排序
排序原则:将最大(或最小)的数通过比较像泡泡一样冒出来(冒出的位置通常是在队伍的最后面)。

实现思路:外层循环控制比较趟数,内层循环控制该趟数两两比较的次数,在一趟里前后两个元素依次两两比较并将更大(或更小)的数放到后面最后使得最大(或最小)的数被放到了队伍的最后。

代码实现举例:
实现将一个整型数组里的元素按升序排列:

public static void bubbleSort(int[] arr){
		for(int i=0;i<arr.length-1;i++){
			for(int j=0;j<arr.length-1-i;j++){
				if(arr[j]>arr[j+1]){    //arr[j]>arr[j+1]升序排列,arr[j]<arr[j+1]降序排列
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
	}

在主函数里调用测试:

int[] arr={56,78,12,54,30};
		bubbleSort(arr);
		for(int i:arr){
			System.out.println(i);
		}

测试结果如下所示:
冒泡排序测试结果
2.生成去重随机数
实现思路:
(1)生成随机数的方法:Math.random();
对于此方法产生的随机数范围是[0,1),即可以取到0.0和1.0之间的任意double数值(包括0但不包括1)。
在产生整型随机数时需要强制转换成int类型,并且如果想要得到固定范围内(m到n之间)的整型数值的话可以利用以下公式:
int random=(int)(Math.random()*(n-m+1)+m)
(2)去重思路:外层可以定义成一个死循环,循环内部一直生成随机数,
内层循环遍历数组,只要数组中有这个随机数就break内层循环,进入外层死循环重新产生随机数。
再定义一个count用来计不重复随机数的数组下标数(初始值为0),当数组遍历完后还没break说明在数组里没找到与该随机数重复的元素,就可以将该随机数存入数组里,下标为count,每次放的时候count都加1,最后count达到数组的长度时跳出外层死循环。

代码实现举例:
随机生成5个不重复的1~5之间的整数,并存放在数组里:

public static int[] nonDuplicateRandom(){
		int[] arr=new int[5];
		int i,count=0;
		for(;;){
			int random=(int)(Math.random()*5+1);
			for(i=0;i<arr.length;i++){
				if(random==arr[i]){
					break;
				}
			}
			if(i==arr.length){
				arr[count]=random;
				count++;
				if(count==arr.length){
					break;
				}
			}
		}
		return arr;
	}

在主函数里调用测试:

		for(int i:nonDuplicateRandom()){
			System.out.println(i);
		}

测试结果(只展示三次的测试结果):
随机数去重第1次测试结果
随机数去重第2次测试结果
随机数去重第3次测试结果

(补充:如果要生成随机大小写字母的话,只需要将随机数公式里的int改成char即可,大写字母A-Z对应ASCII码表里的范围是65-90,小写字母a-z对应ASCII码表里的范围是97-122)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值