[CowCoder—001][Java]冒泡排序相关

题目: 现有一个n个整数的序列,你要做的就是交换两个数的位置直到整个序列按照升序排列,那么将这个整数序列排好序,需要交换多少次?例如,1,2,3,5,4,我们只需要交换一次,即将5和4交换即可。

这种类型的题目是冒泡排序的变形题

方法一:
冒泡排序:上来就给他整2个for循环

//记录循环化次数
private int count = 0;
	public int sort1(int[] a) {
	    //用来换位的
		int temp = 0;
		for(int i = 0;i<a.length-1;i++) {
			//控制外循环
			for(int j = 0;j<a.length-1;j++) {
				//控制内循环
				//换位
				if(a[j+1]<a[j]) {
					temp =a[j];
					a[j]=a[j+1];
					a[j+1]=temp;
					count++;
				}
			}
		}
		return count;
	}

运行结果:
测试结果
方法二:
我们还可以使用递归的方式:

private int count = 0;
	public int sort2(int[] a) {
		int i = 0;
		while(i<a.length-1) {
			//找出一个比自己下一个小的数
			if(a[i]>a[i+1]) {
				//用异或进行换位
				a[i]=a[i]^a[i+1];
				a[i+1]=a[i]^a[i+1];
				a[i]=a[i]^a[i+1];
				//调用自身
				sort1(a);
				count++;
			}
			i++;
		}
		return count;
	} 

结果:
测试结果
主程序main方法:

public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入整数的个数:");
        int n = sc.nextInt();
        //生成相应大小的数组
        int[] a =new int[n];
        System.out.println("请输入相应个数的整数:(分别用','隔开)");
        String str = sc.next();
        //将字符串切分成字符串数组
        String[] strArr = str.split(",");
        for (int i = 0; i < strArr.length; i++) {
        	//与数组a一一对应赋值,需要进行类型转换
			a[i]=Integer.valueOf(strArr[i]);
		}
		//打印转换前的数组
        System.out.println(Arrays.toString(a));
		CowCoder01 cowCoder01 = new CowCoder01();
		//进行转换
		System.out.println("转换次数:"+cowCoder01.sort2(a));
		//打印转换后的数组
		System.out.println(Arrays.toString(a));
	}

PS:
转换两个变量的值的方法:
1.中间变量法

	//设一个中间变量
	int temp;
    temp=a;
    a=b;
    b=temp;
    System.out.println("a= "+a+"   b= "+b);

2.加减法

	a=a+b;
    b=a-b;
    a=a-b;
    System.out.println("a="+a+"   b="+b);

3.异或法。这个方法比较偏,但是如果面试写出来很装x哦!

	a=a^b;
    b=a^b;
    a=a^b;
    System.out.println("a="+a+"   b="+b);

结果:
测试结果

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值